Упаковка названных аргументов в dict

Я знаю, что могу превращать аргументы функции в словарь, если функция принимает **kwargs.

def bar(**kwargs):
    return kwargs

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

Однако верно ли противоположное? Могу ли я упаковать именованные аргументы в словарь и вернуть их? Ручная кодировка выглядит следующим образом:

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

Но похоже, что должен быть лучший способ. Обратите внимание, что я пытаюсь избежать использования **kwargs в функции (именованные аргументы лучше работают для IDE с завершением кода).

+7
источник поделиться
1 ответ

Похоже, вы ищете locals:

>>> 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:

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

Это не должно быть проблемой, если ваши функции подобны данным в вашем вопросе. Если это так, вы можете использовать inspect.getfullargspec и понимание словаря для фильтрации locals():

>>> 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}
>>>
+9
источник

Посмотрите другие вопросы по меткам или Задайте вопрос