假设函数a_method的定义如下
def a_method(arg1, arg2):
pass
从a_method本身开始,我怎么能得到参数名-例如,作为字符串的元组,如("arg1", "arg2")?
假设函数a_method的定义如下
def a_method(arg1, arg2):
pass
从a_method本身开始,我怎么能得到参数名-例如,作为字符串的元组,如("arg1", "arg2")?
当前回答
为了更新一点Brian的答案,现在有一个很好的后端口inspect。可以在较旧的python版本中使用的签名:funcsigs。 所以我的个人偏好是
try: # python 3.3+
from inspect import signature
except ImportError:
from funcsigs import signature
def aMethod(arg1, arg2):
pass
sig = signature(aMethod)
print(sig)
为了好玩,如果你有兴趣玩签名对象,甚至动态地创建随机签名的函数,你可以看看我的makefun项目。
其他回答
操作一些函数的参数名称的最简单方法:
parameters_list = list(inspect.signature(self.YOUR_FUNCTION).parameters))
结果:
['YOUR_FUNCTION_parameter_name_0', 'YOUR_FUNCTION_parameter_name_1', ...]
这样做会更容易,因为你得到了具体的一个:
parameters_list = list(inspect.signature(self.YOUR_FUNCTION).parameters)[0]
结果:
'YOUR_FUNCTION_parameter_name_0'
布莱恩的回答更新如下:
如果Python 3中的函数只有关键字参数,那么你需要使用inspect.getfullargspec:
def yay(a, b=10, *, c=20, d=30):
pass
inspect.getfullargspec(yay)
收益率:
FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=(10,), kwonlyargs=['c', 'd'], kwonlydefaults={'c': 20, 'd': 30}, annotations={})
返回参数名列表,负责部分和正则函数:
def get_func_args(f):
if hasattr(f, 'args'):
return f.args
else:
return list(inspect.signature(f).parameters)
在Python 3中。+有了Signature对象,获得参数名到值之间映射的简单方法就是使用Signature的bind()方法!
例如,这是一个用于打印地图的装饰器:
import inspect
def decorator(f):
def wrapper(*args, **kwargs):
bound_args = inspect.signature(f).bind(*args, **kwargs)
bound_args.apply_defaults()
print(dict(bound_args.arguments))
return f(*args, **kwargs)
return wrapper
@decorator
def foo(x, y, param_with_default="bars", **kwargs):
pass
foo(1, 2, extra="baz")
# This will print: {'kwargs': {'extra': 'baz'}, 'param_with_default': 'bars', 'y': 2, 'x': 1}
在CPython中,参数的数量是
a_method.func_code.co_argcount
他们的名字在开头
a_method.func_code.co_varnames
这些是CPython的实现细节,所以这可能不适用于Python的其他实现,比如IronPython和Jython。
承认“传递”参数的一种可移植方法是使用func(*args, **kwargs)签名来定义函数。这在matplotlib中被大量使用,其中外层API层将大量关键字参数传递给底层API。