Значение по умолчанию для параметра функции Python импортируется из другого модуля
Давайте рассмотрим следующий пример:
import module
def function(param=module.value):
pass
Это хорошая практика, чтобы установить значение по умолчанию аргумента функции для идентификатора, импортированного из другого модуля? Я знаю, что это работает, но я скорее спрашиваю о подходе чистого кода и возможных проблемах. Я вижу здесь потенциальную уязвимость: значение переменной, импортированной из module
может быть изменяемым в следующем выпуске. Что ты об этом думаешь?
2 ответа
Я предлагаю установить значение по умолчанию None
затем программно проверьте это в своем коде:
import module
def function(param = None):
if param is None:
param = module.value
Может быть так, что прямое назначение (которое просто копирует ссылку) не подходит.
Например, вы упоминаете, что класс объекта может меняться от неизменяемого к изменяемым между выпусками. Если это произойдет, то вам, вероятно, нужно использовать copy.deepcopy()
а не назначение.
Однако не все классы имеют свои __deepcopy__()
и поэтому копирование объектов может быть проблематичным. Может быть так, что новый объект должен быть создан с использованием значений из оригинала. Трудно сказать, что следует использовать, не зная класса объекта и что вы собираетесь делать param
,
Вы можете написать обертку для ваших целей. Если библиотека изменила или устарела, вы все равно можете получить то же значение.
Просто напишите простую обертку moduleWrapper
def getValue():
try:
return module.value
except:
return None
Или вы можете установить желаемое значение по умолчанию, а затем вы можете установить эту функцию как параметр.
import moduleWrapper
def function(param=moduleWrapper.getValue()):
pass
Таким образом, если модуль изменится, вы все равно сможете заставить свой код работать.