看到这个线程中有很多不同的答案,我想我会用inspect.signature()
来支付我的两分钱。
假设您有这样的方法:
def foo(**kwargs):
您可以测试**kwargs
是否在此方法的签名中:
import inspect
sig = inspect.signature(foo)
params = sig.parameters.values()
has_kwargs = any([True for p in params if p.kind == p.VAR_KEYWORD])
More
获取方法采用的参数也是可能的:
import inspect
sig = inspect.signature(foo)
params = sig.parameters.values()
for param in params:
print(param.kind)
您也可以将它们存储在一个变量中,如下所示:
kinds = [param.kind for param in params]
# [<_ParameterKind.VAR_KEYWORD: 4>]
除了关键字参数之外,总共有5种参数类型,如下所示:
POSITIONAL_ONLY # parameters must be positional
POSITIONAL_OR_KEYWORD # parameters can be positional or keyworded (default)
VAR_POSITIONAL # *args
KEYWORD_ONLY # parameters must be keyworded
VAR_KEYWORD # **kwargs
官方文档中的描述可以找到此处。
Examples
仅限位置
def foo(a, /):
# the / enforces that all preceding parameters must be positional
foo(1) # valid
foo(a=1) #invalid
位置_或_关键字
def foo(a):
# a can be passed via position or keyword
# this is the default and most common parameter kind
变量_位置
def foo(*args):
KEYWORD_ONLY
键
def foo(*, a):
# the * enforces that all following parameters must by keyworded
foo(a=1) # valid
foo(1) # invalid
<code>VAR_KEYWORD</code>
def foo(**kwargs):