关于python:将命名参数打包到dict中

packing named arguments into a dict

我知道如果函数接受**kwargs,我可以将函数参数转换为字典。

1
2
3
4
5
def bar(**kwargs):
    return kwargs

print bar(a=1, b=2)
{'a': 1, 'b': 2}

但是,情况恰恰相反? 我可以将命名参数打包到字典中并返回它们吗? 手动编码版本如下所示:

1
2
def foo(a, b):
    return {'a': a, 'b': b}

但似乎必须有更好的方法。 请注意,我试图避免在函数中使用**kwargs(命名参数对于代码完成的IDE更有效)。


听起来你正在寻找locals

1
2
3
4
5
6
7
8
9
10
11
>>> def foo(a, b):
...     return locals()
...
>>> foo(1, 2)
{'b': 2, 'a': 1}
>>> def foo(a, b, c, d, e):
...     return locals()
...
>>> foo(1, 2, 3, 4, 5)
{'c': 3, 'b': 2, 'a': 1, 'e': 5, 'd': 4}
>>>

但请注意,这将返回foo范围内的所有名称的字典:

1
2
3
4
5
6
7
>>> def foo(a, b):
...     x = 3
...     return locals()
...
>>> foo(1, 2)
{'b': 2, 'a': 1, 'x': 3}
>>>

如果您的功能与问题中给出的功能类似,那么这不应该是一个问题。 但是,如果是,则可以使用inspect.getfullargspec和字典理解来过滤locals()

1
2
3
4
5
6
7
8
9
>>> def foo(a, b):
...     import inspect # 'inspect' is a local name
...     x = 3          # 'x' is another local name
...     args = inspect.getfullargspec(foo).args
...     return {k:v for k,v in locals().items() if k in args}
...
>>> foo(1, 2) # Only the argument names are returned
{'b': 2, 'a': 1}
>>>