Значение по умолчанию для параметра функции Python импортируется из другого модуля - PullRequest
0 голосов
/ 06 ноября 2018

Давайте рассмотрим следующий пример:

import module

def function(param=module.value):
    pass

Является ли хорошей практикой установка значения аргумента функции по умолчанию для идентификатора, импортированного из другого модуля? Я знаю, что это работает, но я скорее спрашиваю о подходе чистого кода и возможных проблемах. Я вижу здесь потенциальную уязвимость: значение переменной, импортированной из module, может быть изменяемым в следующем выпуске. Что вы думаете об этом?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете написать упаковщик для вашей цели. Если библиотека изменила или устарела, вы все равно можете получить то же значение.

Просто напишите простую обертку moduleWrapper

def getValue():
    try:
        return module.value
    except:
        return None

Или вы можете установить желаемое значение по умолчанию, а затем установить эту функцию в качестве параметра.

import moduleWrapper
def function(param=moduleWrapper.getValue()):
    pass

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

0 голосов
/ 06 ноября 2018

Я предлагаю установить значение по умолчанию None, а затем программно проверить это в своем коде:

import module

def function(param = None):
    if param is None:
        param = module.value

Возможно, прямое назначение (которое просто копирует ссылку) не подходит.

Например, вы упоминаете, что класс объекта может меняться от неизменяемого к изменяемым между выпусками. Если это произойдет, вам, вероятно, придется использовать copy.deepcopy() вместо назначения.

Однако не все классы имеют свои __deepcopy__(), поэтому копирование объектов может быть проблематичным. Возможно, новый объект будет создан с использованием значений из оригинала. Трудно сказать, что следует использовать, не зная класса объекта и что вы собираетесь делать с param.

...