使用 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")
我想知道是否有更好的方法来实现这一目标。
As 由吉姆·法萨拉基斯-希利亚德建议 https://stackoverflow.com/a/42352775/6076911处理 *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 https://docs.python.org/3/library/inspect.html#inspect.Parameter.kind参数的属性不等于Parameter.VAR_POSITIONAL
.
For *args
,这是从函数构建签名对象时设置的值:
>>> def foo(a, b, c=1, *args): pass
>>> print(signature(foo).parameters['args'].kind)
VAR_POSITIONAL
所以只需导入Parameter
from inspect
并添加或条件kind != Parameter.VAR_POSITIONAL
:
>>> from inspect import Parameter
>>> Parameter.VAR_POSITIONAL == p['args'].kind
True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)