Шаблон Python для хранения аргументов по умолчанию для подфункции

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

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 ответа

Решение

Чаще всего используют дополнительные varargs (*args) и / или (предпочтительно imho) необязательные ключевые слова args (**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() имеет более одного параметра.

Редактировать: этот ответ всегда имеет приоритет subfuncx параметр, потому что нет возможности для 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 значение по умолчанию для х, в этом случае None,

Другие вопросы по тегам