获取传递给函数的参数的列表/元组/字典?
鉴于以下function:
def foo(a, b, c): pass
如何获得传入的参数的列表/元组/字典/等, 而不必自己构build结构 ?
具体来说,我正在寻找Python的JavaScript的arguments
关键字或PHP的func_get_args()
方法的版本。
我不在寻找的是使用*args
或**kwargs
的解决scheme; 我需要在函数定义中指定参数名称(以确保它们被传入),但是在函数中,我希望在列表或字典式结构中使用它们。
您可以使用locals()
来获取函数中的局部variables的字典,如下所示:
def foo(a, b, c): print locals() >>> foo(1, 2, 3) {'a': 1, 'c': 3, 'b': 2}
然而,这样做有点冒失,因为locals()
返回本地作用域中的所有variables,而不仅仅是传递给函数的参数,所以如果不在函数的顶部调用它,结果可能包含更多的信息比你想要的要多:
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}
我宁愿按照其他答案的build议,在函数的顶部构build一个你需要的variables的字典或列表。 它更加明确,并以更清晰的方式传达您的代码的意图,恕我直言。
您可以使用检查模块:
def foo(x): return x inspect.getargspec(foo) Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)
这是这个和这个的重复。
如果参数不符合预期,我会使用*args
或**kwargs
并抛出一个exception
如果你想得到比python检查的错误更多的错误,你可以这样做
def check_arguments(function_name,args,arg_names): missing_count = len(arg_names) - len(args) if missing_count > 0: if missing_count == 1: raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1])) else: raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))
使用与事端
def f(*args): check_arguments("f",args,["a","b","c"]) #whatever you want ...
你已经在头文件中指定了参数?
你为什么不简单地在身体中使用相同的信息?
def foo(a, b, c): params = [a, b, c]
我错过了什么?
您可以使用以下命令创build列表:
args = [a,b,c]
您可以使用以下方法轻松创build元组:
args =(a,b,c)
一个解决scheme,使用装饰器,在这里 。
从一个重复的(老的??)问题接受的答案https://stackoverflow.com/a/582206/1136458 :
frame = inspect.currentframe() args, _, _, values = inspect.getargvalues(frame)