Рассмотрим типичную функцию с аргументами по умолчанию:
def f(accuracy=1e-3, nstep=10):
...
Это компактно и легко понять. Но что, если у нас есть другая функция g
, которая вызовет f
, и мы хотим передать некоторые аргументы от g
до f
? Естественный способ сделать это:
def g(accuracy=1e-3, nstep=10):
f(accuracy, nstep)
...
Проблема с этим способом заключается в том, что значения по умолчанию дополнительных аргументов повторяются. Обычно при распространении аргументов по умолчанию, подобных этому, в верхней функции (g
) требуется одинаковое значение по умолчанию, как в нижней функции (f
), и, следовательно, в любое время, когда по умолчанию изменяется значение f
, нужно пройти все функции, которые его вызывают и обновляют значения по умолчанию любого из своих аргументов, они будут распространяться на f
.
Другой способ сделать это - использовать аргумент-заполнитель и заполнить его значение внутри функции:
def f(accuracy=None, nstep=None):
if accuracy is None: accuracy = 1e-3
if nstep is None: nstep=10
...
def g(accuracy=None, nstep=None):
f(accuracy, nstep)
...
Теперь вызывающей функции не нужно знать, что f
значения по умолчанию. Но интерфейс f
теперь немного более громоздкий и менее ясный. Это типичный подход в языках без явной поддержки аргументов по умолчанию, например fortran или javascript. Но если все это делается в python, вы удаляете большую часть поддержки аргументов по умолчанию для языка.
Есть ли лучший подход, чем эти два? Каков стандартный, питонический способ сделать это?