Как узнать, какие аргументы хранятся в параметре ** kwargs при инициализации класса? - PullRequest
0 голосов
/ 26 сентября 2019

Я недавно начал писать код на Python, и у меня возник вопрос о параметре ** kwargs и инициализации класса.

В случае следующего создания класса и метода init как узнать, что хранится в ** kwargs?В этом случае «net» - это словарь Python, содержащий разные ключи.Эти ключи загружены в параметр ** kwargs?Кроме того, если я пытаюсь напечатать ** kwargs в методе init , он не выводит никакой печати в консоль python, почему это так?Разве мне не разрешено печатать по методу init ?

Спасибо.

''' instantiation '''    
    sf = op.algorithms.StokesFlow(network=net, phase=water)


''' __init__ method of the StokesFlow class '''
    def __init__(self, settings={}, phase=None, **kwargs):
        def_set = {'phase': None,
                   'quantity': 'pore.pressure',
                   'conductance': 'throat.hydraulic_conductance',
                   'gui': {'setup':        {'phase': None,
                                            'quantity': '',
                                            'conductance': ''},
                           'set_rate_BC':  {'pores': None,
                                            'values': None},
                           'set_value_BC': {'pores': None,
                                            'values': None},
                           'set_source':   {'pores': None,
                                            'propname': ''}
                           }
                   }
        print("kwargs:", **kwargs)
        super().__init__(**kwargs)
        self.settings.update(def_set)
        self.settings.update(settings)
        if phase is not None:
            self.setup(phase=phase)

1 Ответ

2 голосов
/ 26 сентября 2019

Некоторые объяснения:

kwargs являетсяДИКТ.Kwargs ловит именованные аргументы, которые не указаны отдельно в сигнатуре функции.** означает, что диктат распаковывается.( Объяснение по распаковке здесь )

Вы ничего не получите, потому что вы, вероятно, ничего не передали этой функции.

def fun1(**kwargs):
    print(kwargs)

fun1() -> print {}

fun1(1) -> ошибка, TypeError: fun1() takes 0 positional arguments but 1 was given

fun1(a=1) -> {'a': 1}

Что происходит, когда вы делаете print(**kwargs) там, как высделал в вашем коде?

Первый пример ничего не печатает (пустой словарь ничего не распаковывает): print(**{}) == print().

Последний пример сломается.Потому что print(**{'a': 1}) == print(a=1) и печати ничего подобного не нравится

...