Нещодавно це мене вкусило двічі (я знаю, що з першої помилки повинен був навчитися з першого разу), і прийнята відповідь мені ніколи не допомогла, тому, поки вона свіжа в моїй свідомості, я думав, що подаю свою власну відповідь про всяк випадок хтось інший стикається з цим (або мені це потрібно знову в майбутньому).
У моєму випадку проблема полягала в тому, що я передавав 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