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