关于python:获取传递给函数的参数的列表/元组/字典?

Get a list/tuple/dict of the arguments passed to a function?

鉴于以下功能:

1
2
def foo(a, b, c):
    pass

如何获得传入的参数的list / tuple / dict / etc,而不必自己构建结构?

具体来说,我正在寻找Python的arguments关键字或PHP的func_get_args()方法的Python版本。

我不想要的是使用*args**kwargs的解决方案; 我需要在函数定义中指定参数名称(以确保它们被传入),但在函数中我希望在list-或dict-style结构中使用它们。


您可以使用locals()来获取函数中局部变量的字典,如下所示:

1
2
3
4
5
def foo(a, b, c):
    print locals()

>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}

但是,这有点hackish,因为locals()返回本地范围内的所有变量,而不仅仅是传递给函数的参数,所以如果你不在函数的最顶层调用它,结果可能包含更多信息比你想要的:

1
2
3
4
5
6
7
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}

我宁愿在你的函数顶部构建一个dict或变量列表,如其他答案所示。它更明确,并以更清晰的方式传达代码的意图,恕我直言。


您可以使用inspect模块:

1
2
3
4
5
def foo(x):
    return x

inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

这与此相关。


如果参数不符合预期,我会使用*args**kwargs并抛出异常

如果你想拥有与python检查的错误相同的错误,你可以做类似的事情

1
2
3
4
5
6
7
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]))

与某些人一起使用

1
2
3
4
def f(*args):
    check_arguments("f",args,["a","b","c"])
    #whatever you want
    ...


从一个重复的(旧的??)问题接受的答案https://stackoverflow.com/a/582206/1136458:

1
2
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)

这里有一个使用装饰器的解决方案。


您可以使用以下方法创建列表:

1
args = [a, b, c]

您可以使用以下方法轻松创建元组:

1
args = (a, b, c)


你在标题中指定了参数?

为什么不简单地在身体中使用相同的信息?

1
2
def foo(a, b, c):
   params = [a, b, c]

我错过了什么?