Объедините явные аргументы ключевых слов и ** kwargs - PullRequest
1 голос
/ 30 января 2020

В Python я могу явно перечислить параметры только для ключевых слов, которые принимает функция:

def foo(arg, *, option_a=False, option_b=False):
    return another_fn(arg, option_a=option_a, option_b=option_b)

Хотя синтаксис для вызова другой функции немного многословен, я получаю хорошее автозаполнение при именованные аргументы в вызове функции:

Autocomplete on named arguments in vscode

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

def foo(arg, **kwargs):
    return another_fn(arg, **kargs)

Но тогда я теряю автозаполнение в моем редакторе (и имею гораздо менее четкую сигнатуру функции):

No autocomplete with kwargs

Как я могу получить лучшее из обоих миров? Я хотел бы написать явную сигнатуру функции, но все же получить kwargs dict в теле функции.

1 Ответ

0 голосов
/ 01 мая 2020

Это возможный сценарий использования для locals():

def foo(arg, arg2=None):
    return another_fn(**locals())

Если вам нужно, вы также можете распаковать self:

class bar:
    def foo(self, arg):
        kwargs = locals()
        kwargs.pop('self')
        return another_fn(**kwargs)

Предостережение: если вы определите какие-либо локальные переменные в методе перед вызовом locals(), они попадут в вывод, и вам придется их отфильтровать.

def foo(self, arg=None):
    baz = 'Oops'
    kwargs = locals() # {'self': <bar at 0x0000>, 'arg': None, 'baz': 'Oops'}
    return another_fn(**kwargs)

Простое решение просто позвоните locals(), прежде чем делать что-либо еще, сделайте копию для безопасности и не забудьте очистить self в методах экземпляра:

class bar:
    def foo(self, arg=None):
        kwargs = locals().copy() # {'self': <bar at 0x0000>, 'arg': None}
        kwargs.pop('self')
        baz = 'Oops'
        return another_fn(**kwargs)

Надеюсь, это поможет!

...