Использование пустого кортежа в качестве аргумента по умолчанию итерации по умолчанию

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

def foo(a, b=()):
  print a
  for x in b:
    print x

Я не могу найти много примеров этого варианта использования.

Ответ 1

Я не могу думать о каких-либо недостатках, потому что, когда вам нужен неизменный итерабельный. Я думаю, что это просто не используется, потому что шаблон default_list=None и default_list = default_list or None - это то, что используется для изменяемых итераций, и люди не потрудились его изменить (поскольку нет реальной необходимости) в менее часто встречающихся случаях, когда итерабельность неизменна. Конечно, нет никакого неожиданного поведения, как с изменяемыми аргументами по умолчанию.

Ответ 2

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

Это зависит от вашей цели для аргумента. В пустом списке будут более очевидные приложения для аргумента по умолчанию (по крайней мере те, которые каким-то образом изменяют список), но пустой неизменяемый кортеж не будет иметь интуитивно понятного использования в качестве значения по умолчанию, кроме указания того, что аргумент не указан.

Типичный подход для аргументов по умолчанию заключается в том, чтобы установить их в None, что делает его совершенно ясным, когда аргументы не были установлены:

def foo(a, b=None):