Есть ли более чистый способ передачи кваргов из класса в функцию

#python #python-class

Вопрос:

Я только начинаю работать с кваргами в классах python, и я уверен, что это тривиальный вопрос, но я не могу найти достаточного ответа в Интернете.

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

Вот упрощенная версия моей проблемы с контекстом многословия:

Мои требования таковы:

  1. подробный становится значением конфигурации, если не указано иное
 test().func() -> "Verbose = True"
 
  1. подробный становится кваргом, передаваемым классу при инициализации.
 test(verbose=False).func() -> "Verbose = False"
 
  1. подробный становится кваргом, передаваемым функции при вызове функции.
 test().func(verbose=False) -> "Verbose = False"
 
  1. (необязательно, но не обязательно жертвовать даже дополнительной линией сложности):
    подробный становится конфигурацией даже без инициализации
 test.func() -> "Verbose = True"
 

Мое Решение:

 class test():

    CONFIG = {"verbose":True}

    def __init__(self,**kwargs):
        self.__dict__.update(self.CONFIG)
        self.__dict__.update(**kwargs)
    
        
    def func(self=None,**kwargs):
        verbose = kwargs['verbose'] if 'verbose' in kwargs else self.verbose
        print(f"Verbose = {verbose}")
 

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

Спасибо

Ответ №1:

Вы можете использовать get() метод по умолчанию.

 def funct(self, **kwargs):
    verbose = kwargs.get('verbose', self.verbose)
    print(f"Verbose = {verbose}")
 

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

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

1. Спасибо. Когда вы имеете в виду отсутствие необходимости в значении по умолчанию для self, вы имеете в виду self=Нет? Я часто пишу свои методы таким образом, чтобы я мог вызывать их, не инициируя класс(для использования в аналогичных проектах). Таким образом,при определении метода def 1(self=None, arg1):, вы можете вызвать его с помощью class1.method1(arg1). Я никогда не видел этого нигде, кроме своего собственного кода. как вы думаете, это непрактично или неправильно?

2. Да,именно это я и имел в виду. Я также не видел этой закономерности. Если метод не нуждается в self аргументе, он должен быть определен как @staticmethod или @classmethod .

Ответ №2:

Я верю, что это то, что вы ищете:

 class test():
    # A class variable will act as a default value for objects.
    verbose = True

    def __init__(self,**kwargs):
        # It's better to use setattr. Modifying __dict__ might bypass some
        # important automated stuff.
        for k, v in kwargs.items():
            setattr(self, k, v)
    
    # self must not be None. 'None.verbose' is an error.
    def func(self, **kwargs):
        # Use the get method when the value might not be in the dict.
        verbose = kwargs.get('verbose', self.verbose)
        print(f"Verbose = {verbose}")
 

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

1. Спасибо и за это, это именно то, что я искал.