Шаблон Python для хранения аргументов по умолчанию для подфункции - PullRequest
0 голосов
/ 20 сентября 2018

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

def subfunc(x=10):
    # do something with x

def callingfunc(x=None):
    y= subfunc() if x is None else subfunc(x) # IS THIS AN ANTI PATTERN?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Чаще всего для этого используются необязательные аргументы varargs (*args) и / или (предпочтительно imho) необязательных ключевых слов (**kwargs).Предположим, что callingfunc() также принимает некоторый собственный параметр y:

def subfunc(x=10):
    """ Do something with x

    :param x: used to do something (default: 10)
    """
    print("subfunc({})".format(x))

def callfunc(y, **kwargs):
    """ Do something with `y` and calls `subfunc()`

    :param y: something to do something with
    :param kwargs: will be passed to `subfunc()` (cf `subfunc() doc)`
    """ 

    print("callfunc({})".format(y))
    subfunc(**kwargs)


callfunc(42)
callfunc(42, x="bar")

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

0 голосов
/ 20 сентября 2018

Редактировать: Этот ответ всегда переопределяет параметр subfunc x, потому что невозможно вызвать subfunc без определенного параметра x.Так что это не правильно.

Я не исправляю это, потому что ответ Бруно уже хороший.


Вы можете написать это так:

def subfunc(x=10):
    print(x)

def callingfunc(x=None):
    subfunc(x)

callingfunc()
callingfunc(20)
callingfunc(30)

Он печатает:

None
20
30

Таким образом, вы либо передаете значение, которое переопределяет 10, либо вы не'и переопределите 10 значением callingfunc по умолчанию для x, в данном случае None.

...