Недавно это укусило меня дважды (я знаю, что в первый раз я должен был извлечь уроки из своей ошибки), и принятый ответ мне ни разу не помог, поэтому, пока он свеж в моей голове, я подумал, что отправлю свой собственный ответ на всякий случай кто-нибудь еще сталкивается с этим (или мне это понадобится снова в будущем).
В моем случае проблема заключалась в том, что я передавал kwarg в инициализацию подкласса, но в суперклассе это ключевое слово arg затем передавалось в вызов super ().
Я всегда думаю, что такие вещи лучше всего на примере:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
def some_other_method(self):
raise NotImplementedException
class Bar(Foo):
def some_other_method(self):
print('Do some magic')
Bar(42)
Bar(42, named_optional_param={'xyz': 123})
Чтобы решить эту проблему, мне просто нужно изменить порядок действий в методе Foo .__ init__; например:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1