Python - Выберите функцию или измените модуль на основе пользовательского ввода во время создания класса - PullRequest
0 голосов
/ 04 марта 2020

Я думаю, что публикация хотя бы минимального рабочего примера этой проблемы может быть грязной, поэтому я собираюсь обрисовать проблему с помощью псевдокода. У меня есть модуль, в котором я определил класс - давайте назовем его 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, передавая только функцию «зависящую», если эта опция предоставляется во время создания экземпляра класса? Обратите внимание, что несколько экземпляров класса могут быть вызваны / запущены одновременно.

Спасибо!

...