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

115 投票
8 回答
64430 浏览
提问于 2025-04-15 20:52

给定以下这个函数:

def foo(a, b, c):
    pass

我想知道如何获取传入的参数列表、元组或字典等,而不需要自己构建这些结构

具体来说,我想要的是Python中类似于JavaScript的arguments关键字或PHP的func_get_args()方法。

想要的解决方案是使用*args**kwargs; 我需要在函数定义中指定参数名称(以确保它们被传入),但在函数内部我希望以列表或字典的方式来处理这些参数。

8 个回答

8

你可以使用inspect模块:

def foo(x):
    return x

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

这个问题和这个以及这个是重复的。

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}

我更倾向于在函数的开头构建一个你需要的变量的字典或列表,就像其他回答中建议的那样。这种方式更明确,也能更清楚地表达你代码的意图,个人觉得这样更好。

撰写回答