Лучший способ сделать данные, загруженные в main(), неявным аргументом функции в Python

Моя основная функция загружает большой кадр данных из CSV, предоставленного пользователем (вместе с несколькими другими объектами данных), а затем создает экземпляр объекта, который формирует набор уравнений как часть задачи математического программирования. Многие компоненты уравнений возвращаются вызовами примерно 5 вспомогательных функций, которые я определяю в файле utils (что наиболее важно, вне класса, в котором хранится задача оптимизации). Эти вспомогательные функции ссылаются на данные, загруженные в main, но я хочу, чтобы их вызовы отображались в уравнениях как параметризованные только временным индексом t (а не фреймом данных) для удобства чтения. Является ли лучший способ сделать это, чтобы определить эти функции в utils.py с данными в качестве явных параметров, а затем использовать functools.partial перед созданием уравнений, чтобы сделать их неявными?

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


person GrayOnGray    schedule 26.11.2017    source источник
comment
У вас не может быть циклического импорта в Python (да, вы можете импортировать внутри функцию), чтобы импорт был отложен и т. д., но два файла не могут import друг друга в заголовке файла.   -  person Willem Van Onsem    schedule 27.11.2017
comment
@WillemVanOnsem Это неправильно. Циклический импорт на уровне модуля возможен, а иногда даже необходим.   -  person wim    schedule 27.11.2017


Ответы (1)


В итоге я пошел с предложенным ответом:

определите эти функции в utils.py с данными как явные параметры, а затем используйте functools.partial перед созданием уравнений, чтобы сделать их неявными

и с учетом того, что эта кодовая база находится в производстве более года, это кажется мне достаточно разумным.

person GrayOnGray    schedule 30.04.2019