Использование пустого кортежа в качестве аргумента по умолчанию итерации по умолчанию
Есть ли недостатки в использовании пустого кортежа по умолчанию для итеративного аргумента функции? Предполагая, что то, что вы хотите в функции, является неизменным итерабельным.
например.
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):