【问题标题】:How to convert all arguments to dictionary in python如何在python中将所有参数转换为字典
【发布时间】:2017-11-08 19:19:15
【问题描述】:

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

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

应该像这样返回一本字典:

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

【问题讨论】:

  • 在这里看起来像同样的问题stackoverflow.com/questions/582056/…
  • 听起来像是 XY 问题;因为你可以简单地打电话给dict(arg1=arg1, arg2=arg2, arg3=value3, arg4=value4)。你到底想完成什么?
  • @chepner arg1 = { 'x': 'X', y': 'Y'} arg2 = 2, 函数 func(arg1, arg2, arg3= 3) 应该返回 `{'x': 'X', y': 'Y, 'arg2': 2, 'arg3':3 }
  • 好的,这与您在问题中所问的结果截然不同。

标签: python python-2.7 dictionary args keyword-argument


【解决方案1】:

您可以使用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}}

【讨论】:

  • 您的第一个输出看起来很奇怪,arg3&arg4 的值是 1&2 而不是 3&4。应该是:{'arg1': 1, 'arg2': 2, 'arg3': 3, 'arg4': 4}
  • @Nuageux 事实上,这只是一个复制粘贴错误。我修好了。
  • 如果我给字典作为参数呢?我会得到这个{ 'args': ({'argX': 'x', 'argY': 'y}, 'arg1': 1) , kwargs': {}} 而不是这个{'arg1': 1, 'argX': 'x', 'argY': 'y'}
  • @NikolaMijušković 看到我回答的“但是”部分
【解决方案2】:

您正在寻找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}

【讨论】:

  • locals 过于宽泛,如果除了参数之外还有局部变量。
  • @chepner 我想如果你在调用函数后立即调用它,那么它只会列出参数?我认为您可以将其存储为新变量吗?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2018-12-24
    • 2011-11-20
    • 2023-01-07
    相关资源
    最近更新 更多