Я думаю, что публикация хотя бы минимального рабочего примера этой проблемы может быть грязной, поэтому я собираюсь обрисовать проблему с помощью псевдокода. У меня есть модуль, в котором я определил класс - давайте назовем его my_class.py. Методы класса используют много похожего кода, поэтому имеет смысл разбить эти блоки кода на функции и поместить их в отдельный модуль - назовем его functions.py. Для пояснения, functions.py выглядит так:
def dependent(inverted):
if inverted:
return this
else:
return that
def func_a():
do stuff...
dependent()
def func_b():
dependent()
do stuff...
... more functions ...
def func_z()
do stuff...
dependent()
, а my_class.py выглядит так:
from functions import func_a, func_b, func_c
class A():
def __init__(self, inverted=False):
self.inverted = inverted
def method_1(self,):
do stuff....
func_a()
do sfuff ...
func_b()
def method_2(self,):
func_c()
... more methods using functions from functions.py
Теперь вы можете посмотреть на эту странную «зависимую» функцию в functions.py и ключевое слово "inverted" в методе класса init. Видите ли, функции func_a, func_b, ..., func_z в functions.py также многократно используют один и тот же код, поэтому я поместил этот код в функцию с именем зависимым - потому что это функции func_a, func_b, et c. зависят от этого.
Все выглядело довольно гладко, но потом я заметил угловой случай, который мне нужно было рассмотреть. Этот случай легко объяснить использованием логической переменной с именем «инвертированный». Пользователь должен указать, была ли проблема обращена при создании экземпляра класса. Проблема в том, что единственная функция, которую напрямую изменяет, - это зависимая функция. Другие функции, func_a, func_b, et c. будет меняться косвенно, поскольку они зависят от «зависимых». Обратите внимание, что класс никогда не вызывает "зависимый", только func_a, func_b и т. Д. c.
Думаю, я загнал себя в угол. Я не могу придумать чистый способ изменить или передать инвертированную опцию "зависимой" функции из класса в модуль, который класс импортирует. На самом деле, этот процесс кажется круглым и тупым.
Я подумал о двух решениях.
1) Передайте self.inverted в func_a, func_b, ..., func_z. Таким образом, методы будут выглядеть так:
def method_1(self):
do stuff...
func_a(self.inverted)
...
и func_a, func_b, et c. будет выглядеть так:
def func_a(inverted):
do stuff...
dependent(inverted)
или 2) создайте два функциональных модуля, с той лишь разницей, что один имеет зависимый набор return that
, а другой - зависимый return this
(инвертированный регистр). Затем метод init класса импортирует соответствующий функциональный модуль на основе инвертированного аргумента. Визуально:
class A():
def __init__(self, inverted=False):
if inverted:
from functions_inverted.py import func_a, func_b, ...
else:
from functions_normal.py import func_a, func_b, ...
Мне не нравится ни один вариант, так как я повторяю много кода, и это как бы сводит на нет первоначальное намерение сделать код модульным и чистым. Если бы я заметил угловой случай ранее, я, вероятно, использовал бы другой подход, однако в этот момент значительное время было потрачено на приведение кода в его текущее состояние.
Есть ли лучшее решение - такое, которое сохраняет код модульным и чистым, - чтобы я мог изменять все функции в functions.py, передавая только функцию «зависящую», если эта опция предоставляется во время создания экземпляра класса? Обратите внимание, что несколько экземпляров класса могут быть вызваны / запущены одновременно.
Спасибо!