Как передавать аргументы через несколько методов

#python #python-3.x #class #methods

#python #python-3.x #класс #методы

Вопрос:

У меня есть некоторый код на Python, который работает, но мой подход очень утомителен. Основная структура заключается в том, что у меня есть класс, который обрабатывает данные с помощью нескольких методов и возвращает обработанные данные. Структура кода выглядит следующим образом:

 class ExampleClass:
    def __init__(self):
        self.__data = 0
        
    def __AllCalculation(self,arg1=1,arg2=2):
        self.__Calc1(arg1)
        self.__Calc2(arg2)
        
    def __Calc1(self,arg1):
        self.__data arg1
    
    def __Calc2(self,arg2):
        self.__data arg2
        
    def GetResults(self,arg1=1,arg2=2):
        self.__AllCalculation(arg1,arg2)
        return self.__data
  

и пользователь должен только вызывать GetResults() . Существует ли более питонический подход к каскадированию аргументов через функции? Этот подход работает, но его сложно поддерживать, поскольку для одного изменения требуется несколько перезаписей. В идеале, если возможно GetResults() наследовать аргументы от __AllCalculations() включения значений по умолчанию.

Комментарии:

1. есть ли у вас несколько типов вычислений, которые необходимо выполнять в разных обстоятельствах? Например, у вас есть calc1, calc2, calc3 , и вам может понадобиться getresults1 , который вызывает 1 и 2, а getresults2 который вызывает 2 и 3

2. С другой стороны, возможно, нет необходимости отделять getresults от __allcalculation .

3. @jrmylow Да, есть вероятность, что у меня будет другой getresults вариант, который пропустит некоторые вычисления. Я знаю, что простое удаление getresults и __AllCalculation прямое использование решило бы проблему, но вопрос все еще остается в силе; возможно ли распространять аргументы?

4. Если вы достаточно дисциплинированы, использование **kwargs может помочь

5. @jrmylow не могли бы вы привести пример того, как распространять и отслеживать его? Я не могу понять, как GetResults(**kwargs) мы собираемся показать, каковы значения по умолчанию __AllCalculations , и передать эту информацию при использовании функции.

Ответ №1:

Я полагаю, что вы просите, чтобы функция top (GetResults) знала, какие аргументы ей нужно передать по цепочке. Используя текущий метод построения функций, вы убедитесь, что сигнатура каждой функции содержит все переменные, которые она передает. Как вы упомянули, это утомительно поддерживать.

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

 class ExampleClass:
    def __init__(self):
        self.__data = 0
        
    def __AllCalculation(self, **kwargs):
        self.__Calc1(**kwargs)
        self.__Calc2(**kwargs)
        
    def __Calc1(self, arg1, **kwargs):
        self.__data  = arg1

    def __Calc2(self, arg2, **kwargs):
        self.__data  = arg2
        
    def GetResults(self, **kwargs):
        self.__AllCalculation(**kwargs)
        return self.__data

A = ExampleClass()

print(A.GetResults(arg2 = 3, arg1 = 5, arg3 = 1000))    # Prints 8 = 0   5   3
  

Тогда возникает вопрос: как мне узнать, какие аргументы мне нужно передать в начале? Если вы вызываете функцию без указания требуемого аргумента, вы поднимете TypeError , указав, какой именно аргумент ключевого слова вам нужно передать. (По общему признанию, вам может потребоваться вызвать его несколько раз, чтобы перехватить все, но, по крайней мере, вам нужно изменить его только в одном месте)