Dav*_*sia 4 python signature python-3.x
使用Python 3.x,我试图从某个函数获取所有位置参数的名称,即:
def foo(a, b, c=1):
return
Run Code Online (Sandbox Code Playgroud)
现在我这样做:
from inspect import signature, _empty
args =[x for x, p in signature(foo).parameters.items() if p.default == _empty]
Run Code Online (Sandbox Code Playgroud)
当函数alows*args即:
def foo(a, b, c=1, *args):
return
Run Code Online (Sandbox Code Playgroud)
我正在添加这一行:
args.remove("args")
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来实现这一目标.
正如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)
Run Code Online (Sandbox Code Playgroud)
是的,通过另外检查.kind参数的属性是否不等于,您可以实现更强大的解决方案Parameter.VAR_POSITIONAL.
对于*args,这是从函数构建签名对象时设置的值:
>>> def foo(a, b, c=1, *args): pass
>>> print(signature(foo).parameters['args'].kind)
VAR_POSITIONAL
Run Code Online (Sandbox Code Playgroud)
所以,只需要导入Parameter从inspect添加或条件是kind != Parameter.VAR_POSITIONAL:
>>> from inspect import Parameter
>>> Parameter.VAR_POSITIONAL == p['args'].kind
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |