Могу ли я пропустить параметры в Python при использовании Kwargs - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть функция, которая принимает в kwargs.Я хочу использовать параметры kwargs по имени без необходимости явно объявлять каждый из них как параметр или переменную.Есть ли способ использовать my_var_key путем передачи kwargs без необходимости его конкретного определения в вызове функции, или это единственный способ использовать kwargs[ "my_var_key" ]?

Например, я хочучто-то вроде

def func(**kwargs):
    print(my_var_key)

в отличие от

def func(my_var_key, **kwargs):
    print(my_var_key)

или

def func(**kwargs):
    print(kwargs[ "my_var_key" ])

Я в порядке, если ключ не существует.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Не делай этого.Это затрудняет чтение вашего кода.

Но если вы настаиваете, попробуйте изменить область действия globals():

def func(**kwargs):
    for key, val in kwargs.items():
        globals()[key] = val
    print(globals())
    print(my_var_key)

func(my_var_key='foobar')

и выведите:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10f058f28>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'func': <function func at 0x10ef52268>, 'my_var_key': 'foobar'}
foobar

Это наверняка загрязнит ваше глобальное пространство имен (и вы не можете использовать locals(), потому что интерпретатор сбивает с толку).Опять же, не делай этого.

0 голосов
/ 14 февраля 2019

Нет, нет практического способа получить нужный синтаксис.

Одна часть Философия дизайна Python заключается в том, что "явный лучше, чем неявный", поэтому не так много ситуацийгде имена будут добавлены в ваше пространство имен без вашего ввода.Если вы хотите, чтобы my_var_key был помещен в пространство имен вашей функции, когда оно передается в качестве аргумента, вы должны просто назвать его в операторе def.Если вы хотите, чтобы он мог передаваться только в качестве аргумента ключевого слова (а не позиционного), вы можете поместить * в список аргументов:

def func(*, my_var_key): # arg can only be passed as a keyword: func(my_var_key=1)
   ...
...