Лучший способ передать аргументы kwargs переопределенному методу

У меня есть что-то вроде этого:

MyClass(BaseClass):
    def __init__(self, *args, **kwargs):
        data = kwargs.pop('data', None)
        super(BaseClass, self).__init__(*args, **kwargs)

BaseClass представляет собой представление обертки API, и его метод init принимает множество аргументов, таких как, API_KEY, API_SECRET, OAUTH_TOKEN и OUATH_TOKEN_SECRET. Мой вопрос о том, что является правильным или самым чистым способом создания экземпляра MyClass. Я не знаю, сработает ли это:

if __name__ == '__main__':
    obj = MyClass(
        API_KEY,
        API_SECRET,
        OAUTH_TOKEN,
        OAUTH_TOKEN_SECRET,
        {'data': DATA}
    )

Итак, предположим, что это работает, лучше ли упаковать все аргументы в dict и передать их в MyClass?

1 ответ

Решение

**kwargs принимает ключевые аргументы, а не словарь:

obj = MyClass(
    API_KEY,
    API_SECRET,
    OAUTH_TOKEN,
    OAUTH_TOKEN_SECRET,
    data=DATA
)

Конечно, вы можете использовать **kwargs вызовите соглашение, чтобы ваш словарь по-прежнему использовался в качестве аргументов ключевых слов:

obj = MyClass(
    API_KEY,
    API_SECRET,
    OAUTH_TOKEN,
    OAUTH_TOKEN_SECRET,
    **{'data': DATA}
)

Независимо от того, упаковываете ли вы остальные аргументы в ключевые аргументы, полностью зависит от исходного метода на BaseClass; принимает ли эти аргументы в качестве аргументов ключевых слов? В Python 3 это не обязательно задано, и при этом встроенные (определенные C) функции и методы всегда принимают аргументы ключевого слова вместо позиционных аргументов.

Другие вопросы по тегам