【问题标题】:How to determine number of function/builtin/callable parameters programmatically?如何以编程方式确定函数/内置/可调用参数的数量?
【发布时间】:2016-10-11 10:41:18
【问题描述】:

我希望能够根据参数的数量对未知函数/内置函数/可调用函数进行分类。

我可能会写一段这样的代码:

if numberOfParameters(f) == 0:
    noParameters.append(f)
elif numberOfParameters(f) == 1:
    oneParameter.append(f)
else:
    manyParameters.append(f)

但我不知道如何实现numberOfParameters()inspect.getargspec 不适用于内置函数。我不能使用异常,因为调用该函数可能很昂贵。

如果该解决方案同时适用于 Python 2.7 和 Python 3.3+,那就太好了

【问题讨论】:

  • 你试过help(...)吗?例如。对于sorted,它包含:sorted(iterable, cmp=None, key=None, reverse=False)
  • @jbndlr 这需要解析文档字符串...我不确定你是否想进入那个兔子洞。
  • @jbndlr 我需要以编程方式进行。更新了问题。
  • @juanpa.arrivillaga 他没有提到以编程方式进行(在他编辑之前),我不认为有人会想要为代码中的内置函数执行此操作。
  • 咬紧牙关,组装一个由内置函数(至少是您关心的那些)键入的字典,其值是您想要的信息?它不应该花那么长时间。 [b for b in dir(__builtins__) if b == b.lower() and not b.startswith('_')] 只包含几十个条目,并非所有条目都是函数。

标签: python python-2.7 function python-3.x callable


【解决方案1】:

来自 Python 3.3

3.3 版中的新功能。

Introspecting callables with the Signature object

>>> import inspect
>>> inspect.signature(sorted).parameters
mappingproxy(OrderedDict([('iterable', <Parameter "iterable">), ('key', <Parameter "key=None">), ('reverse', <Parameter "reverse=False">)]))

然后你就可以数一数,随心所欲。

【讨论】:

  • 这在 python 2 中不可用。
  • @JimFasarakis-Hilliard 我在回答中提到了它。 OP 说:“如果该解决方案同时适用于 Python 2.7 和 Python 3.3+,那就太好了”,目前仅适用于 python 3.3+ 的解决方案,我认为这没问题。
【解决方案2】:

你可以在某种程度上做到这一点,但只能在 Python 3 中。这是ArgumentClinic 提供有关可用对象签名的信息的时候。

请注意,目前并非所有内置插件都可用:

__import__ vars max print dir __build_class__ min iter round getattr next 

不要公开有关其签名的信息。对于其余的getargspecgetfullargspec 周围的薄包装)和Signature 就可以了。

在 Python 2 中,您只有 getargspec 选项,这对内置函数不起作用,而且可能永远不会。因此,没有跨越 python 版本的解决方案。对于最兼容的解决方案,我现在使用getargspec

至于最简单的检查方法,只需从返回的NamedTuple 中计算args

def NumberOfParameters(f):
    try:
        r = getargspec(f)
        return len(r.args)  # if it has kwargs, what do you do?
    except TypeError as e:
        print("Function {0} cannot be inspected".format(f.__name__))

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2018-04-16
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多