获取传递给函数的参数列表/元组/字典?
给定以下这个函数:
def foo(a, b, c):
pass
我想知道如何获取传入的参数列表、元组或字典等,而不需要自己构建这些结构?
具体来说,我想要的是Python中类似于JavaScript的arguments
关键字或PHP的func_get_args()
方法。
我不想要的解决方案是使用*args
或**kwargs
; 我需要在函数定义中指定参数名称(以确保它们被传入),但在函数内部我希望以列表或字典的方式来处理这些参数。
8 个回答
14
这里有一个函数,你可以用它来获取当前函数的关键字参数(kwargs)。如果你想直接在自己的函数里使用这些代码,而不是调用 get_kwargs()
,只需要去掉 .f_back
这一部分就可以了。
import inspect
def get_kwargs():
frame = inspect.currentframe().f_back
keys, _, _, values = inspect.getargvalues(frame)
kwargs = {}
for key in keys:
if key != 'self':
kwargs[key] = values[key]
return kwargs
def test(x, y=100):
z = 7
print(get_kwargs())
test(5, 6)
# Output: {'x': 5, 'y': 6}
test(5)
# Output: {'x': 5, 'y': 100}
132
你可以使用 locals()
来获取你函数中所有的局部变量,像这样:
def foo(a, b, c):
print locals()
>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
不过,这种方法有点“黑科技”,因为 locals()
会返回所有局部范围内的变量,而不仅仅是传递给函数的参数。所以如果你不是在函数的最开始调用它,结果可能会包含你不想要的更多信息:
def foo(a, b, c):
x = 4
y = 5
print locals()
>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}
我更倾向于在函数的开头构建一个你需要的变量的字典或列表,就像其他回答中建议的那样。这种方式更明确,也能更清楚地表达你代码的意图,个人觉得这样更好。