假设函数a_method的定义如下
def a_method(arg1, arg2):
pass
从a_method本身开始,我怎么能得到参数名-例如,作为字符串的元组,如("arg1", "arg2")?
假设函数a_method的定义如下
def a_method(arg1, arg2):
pass
从a_method本身开始,我怎么能得到参数名-例如,作为字符串的元组,如("arg1", "arg2")?
当前回答
看一下inspect模块——它将为你检查各种代码对象属性。
>>> inspect.getfullargspec(a_method)
(['arg1', 'arg2'], None, None, None)
其他结果是*args和**kwargs变量的名称,以及提供的默认值。ie。
>>> def foo(a, b, c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))
注意,在Python的某些实现中,一些可调用对象可能不是可内省的。例如,在CPython中,一些用C定义的内置函数不提供关于其参数的元数据。因此,如果在内置函数上使用inspect.getfullargspec(),将会得到一个ValueError。
从Python 3.3开始,你可以使用inspect.signature()来查看可调用对象的调用签名:
>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
其他回答
我在谷歌上搜索如何打印函数名,并为赋值提供参数,我必须创建一个装饰器来打印它们,我使用了这个:
def print_func_name_and_args(func):
def wrapper(*args, **kwargs):
print(f"Function name: '{func.__name__}' supplied args: '{args}'")
func(args[0], args[1], args[2])
return wrapper
@print_func_name_and_args
def my_function(n1, n2, n3):
print(n1 * n2 * n3)
my_function(1, 2, 3)
#Function name: 'my_function' supplied args: '(1, 2, 3)'
现在dir()和vars()呢?
似乎做什么是被要求超级简单…
必须从函数范围内调用。
但要注意,它将返回所有局部变量,所以如果需要,请确保在函数的最开始执行。
还要注意,正如评论中指出的那样,这不允许从作用域之外执行此操作。所以不完全是OP的情况,但仍然符合题目。这就是我的回答。
Python 3的版本是:
def _get_args_dict(fn, args, kwargs):
args_names = fn.__code__.co_varnames[:fn.__code__.co_argcount]
return {**dict(zip(args_names, args)), **kwargs}
该方法返回一个包含args和kwargs的字典。
在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}
为了更新一点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项目。