我正在使用Python 3.x从某个函数获取所有位置参数的名称,即:

def foo(a, b, c=1):
    return
现在我正在这样做:
from inspect import signature, _empty
args =[x for x, p in signature(foo).parameters.items() if p.default == _empty]
当该函数降低* args时,即:
def foo(a, b, c=1, *args):
    return
我要添加一行:
args.remove("args")
我想知道是否有更好的方法来实现这一目标。

作为suggested by Jim Fasarakis-Hilliard处理* args情况的一种更好的方法是使用Parameter.kind:
from inspect import signature, Parameter
args =[]
for x, p in signature(foo).parameters.items():
    if p.default == Parameter.empty and p.kind != Parameter.VAR_POSITIONAL:
        args.append(x)

最佳答案

是的,您可以通过额外检查参数的 .kind 属性是否不等于Parameter.VAR_POSITIONAL来获得更可靠的解决方案。

对于*args,这是从函数构建签名对象时设置的值:

>>> def foo(a, b, c=1, *args): pass
>>> print(signature(foo).parameters['args'].kind)
VAR_POSITIONAL

因此,只需从Parameter导入inspect并添加或kind != Parameter.VAR_POSITIONAL的条件:
>>> from inspect import Parameter
>>> Parameter.VAR_POSITIONAL == p['args'].kind
True

关于python - 从函数的签名中获取位置参数的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42352703/

10-11 22:38
查看更多