计算函数签名中的位置参数

时间:2019-09-11 09:19:19

标签: python python-3.x

我具有以下功能签名:

# my signature
def myfunction(x, s, c=None, d=None):
    # some irrelevant function body

我需要一些位置参数。如何返回位置参数(x&s)的数字(2)。关键字参数的数量无关。

2 个答案:

答案 0 :(得分:4)

您可以获取所有参数的数量(使用f.__code__.co_argcount),关键字参数的数量(使用f.__defaults__),然后从第一个参数中减去后者:

def myfunction(x, s, c=None, d=None):
  pass

all_args = myfunction.__code__.co_argcount

if myfunction.__defaults__ is not None:  #  in case there are no kwargs
  kwargs = len(myfunction.__defaults__)
else:
  kwargs = 0

print(all_args - kwargs)

输出:

2

来自Docs

  

__defaults__:包含具有默认值的那些参数的默认参数值的元组;如果没有参数具有默认值,则为None

和:

  

co_argcount是位置参数(包括具有默认值的参数)的数量;

答案 1 :(得分:1)

您可以使用inspect这样的模块来完成此操作,

>>> import inspect
>>> def foo(a, b, *, c=None):
...   print(a, b, c)
... 
>>> sig = inspect.signature(foo)
>>> sum(1 for param in sig.parameters.values() if param.kind == param.POSITIONAL_OR_KEYWORD)
2

警告是,

  

Python没有用于定义仅位置参数的显式语法,   但是许多内置和扩展模块功能(尤其是那些   只接受一个或两个参数的人)接受它们。