【问题标题】:In Python, 'Inspecting' callable objects that aren't strictly [functions?]在 Python 中,“检查”不是严格意义上的 [函数?]
【发布时间】:2019-05-09 18:25:52
【问题描述】:

我发现questionsanswers 中的a number 处理确定python 中函数* 所需的参数/参数。 Python 有许多可调用对象(使用callable),它们将返回一个值,inspect.getfullargspec 会返回一个错误(inspect.Signature 在我的非正式测试中似乎不太可靠?)。

例如:

inspect.getfullargspec(max) 返回错误: TypeError: unsupported callable

是否有替代检查方法适用于其他“不支持的可调用”[函数/对象?]

查看一些内置的可调用对象,似乎很多都属于“不支持”类别,我只能猜测其他模块/库中的对象。

*我可能在此言过其实,抱歉——有什么方法可以具体确定哪个是哪个?

【问题讨论】:

    标签: python


    【解决方案1】:

    在 CPython 中,内置函数是用 C 实现的,因此有很多怪癖。这是其中之一。以PEP 570为例:

    在当前版本的 Python 中,许多 CPython“内置”和标准 库函数只接受位置参数。这 通过调用其中之一可以很容易地观察到产生的语义 使用关键字参数的函数:

    >>> help(pow)
    ...
    pow(x, y, z=None, /)
    ...
    
    >>> pow(x=5, y=3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: pow() takes no keyword arguments
    

    pow() 表示其参数仅通过 / 标记进行定位。 但是,这只是一个文档约定; Python 开发人员 无法在代码中使用此语法。

    还有一些具有其他有趣语义的函数:

    • range(),一个重载函数,接受一个可选参数 所需参数的左侧。
    • dict(),其映射/迭代器 参数是可选的,并且在语义上必须是仅位置的。任何 此参数的外部可见名称将遮挡该名称 进入 **kwarg 关键字可变参数字典。

    目前(虽然 PEP 没有实现)Python 没有官方方式来表达这些不寻常的语义,例如仅位置参数。

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2016-03-07
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2013-01-01
      相关资源
      最近更新 更多