При использовании необязательных аргументов, когда лучше всего использовать ** kwargs и лучше всего использовать ключевые слова? - PullRequest
0 голосов
/ 22 июня 2019

Если у меня была функция с тремя или четырьмя необязательными аргументами ключевых слов, лучше ли использовать ** kwargs или указать их в определении функции?

Я чувствую как def foo(required, option1=False, option2=False, option3=True) выглядит гораздо более неуклюже, чем def foo(required, **kwargs).

Однако, если мне нужно использовать эти ключевые слова в качестве условных выражений, а они не существуют, у меня будут выдаваться KeyErrors, и я чувствую, что проверяю ключи перед тем, как каждое условное выражение немного запутано.

def foo(required, **kwargs):
    print(required)
    if 'true' in kwargs and kwargs['true']:
        print(kwargs['true'])

foo('test', true='True')
foo('test2')

против

def foo(required, true=None):
    print(required)
    if true:
        print(true)

foo('test', true='True')
foo('test2')

Мне интересно, какой самый питонический путь. У меня есть функция, над которой я работаю, которая в зависимости от переданных параметров будет возвращать разные значения, поэтому мне интересно, как лучше всего справиться с этим. Это работает сейчас, но мне интересно, есть ли лучший и более питонический способ справиться с этим.

Ответы [ 2 ]

5 голосов
/ 22 июня 2019

Если функция использует параметры только в своей собственной операции, вы должны перечислить их все явно. Это позволит Python определить, был ли указан неверный аргумент при вызове вашей функции.

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

0 голосов
/ 22 июня 2019

Один простой способ передать несколько необязательных параметров, сохраняя определение функции чистым, - это использовать словарь, который содержит все параметры. Таким образом, ваша функция становится

def foo(required, params):
    print(required)
    if 'true' in params and params['true']:
        print(params['true'])

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

...