Значение по умолчанию для параметра функции 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

Таким образом, если модуль изменится, вы все равно сможете заставить свой код работать.

Другие вопросы по тегам