如何在Python中将所有参数转换为字典

21

我想让我的函数func(*args, **kwargs)返回一个包含我传递给它的所有参数的字典。例如:

func(arg1, arg2, arg3=value3, arg4=value4)

应该返回一个像这样的字典:

应该返回一个像这样的字典:

{'arg1': value1, 'arg2': value2, 'arg3': value3, 'arg4': value4 }

这里似乎是同样的问题 https://dev59.com/8XRB5IYBdhLWcg3wl4AP - Artem Kryvonis
3
听起来像是一个 XY 问题;因为你可以简单地调用 dict(arg1=arg1, arg2=arg2, arg3=value3, arg4=value4)。你实际上想要达到什么目的? - chepner
@chepner arg1 = {'x': 'X', y': 'Y'} arg2 = 2,函数 func(arg1, arg2, arg3=3) 应返回 {'x': 'X', y': 'Y, 'arg2': 2, 'arg3':3} - nimi
1
好的,这个结果与你在问题中所询问的显然不同。 - chepner
3个回答

27
你可以使用 locals()vars():
def func(arg1, arg2, arg3=3, arg4=4):
    print(locals())

func(1, 2)

# {'arg3': 3, 'arg4': 4, 'arg1': 1, 'arg2': 2}

但是,如果您仅使用*args,则无法使用locals()进行区分:

def func(*args, **kwargs):
    print(locals())

func(1, 2, a=3, b=4)

# {'args': (1, 2), 'kwargs': {'a': 3, 'b': 4}}

1
你的第一个输出看起来很奇怪,arg3和arg4的值为1和2,而不是3和4。应该是:{'arg1': 1, 'arg2': 2, 'arg3': 3, 'arg4': 4} - Nuageux
@Nuageux 确实,那只是一个复制粘贴错误。我已经修复了它。 - DeepSpace
如果我将字典作为参数传递,会得到这个结果 { 'args': ({'argX': 'x', 'argY': 'y}, 'arg1': 1) , kwargs': {}} 而不是期望的结果 {'arg1': 1, 'argX': 'x', 'argY': 'y'} - nimi
@NikolaMijušković 请看我回答中的“然而”部分。 - DeepSpace

4
您正在寻找 locals() 函数。
def foo(arg1, arg2, arg3='foo', arg4=1):
    return locals()

{'arg1': 1, 'arg2': 2, 'arg3': 'foo', 'arg4': 1}

输出:

{'arg1': 1, 'arg2': 2, 'arg3': 'foo', 'arg4': 1}

4
如果除了参数之外还有局部变量存在,那么locals这个词太宽泛了。 - chepner
@chepner 我认为如果您在函数调用时立即调用它,那么它只会列出参数?您可以将其存储为一个新变量,我觉得可以这样做。 - Nick W.

1

如果您无法像其他答案建议的那样使用locals

def func(*args, **kwargs):
    all_args = {("arg" + str(idx + 1)): arg for idx,arg in enumerate(args)}
    all_args.update(kwargs)

这将创建一个包含所有参数及其名称的字典。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接