与第三方发起的问题

2024-10-03 00:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我正试图(通过mixins)合并2个第三方应用程序表单类,但出现了这个错误

__init__() got multiple values for keyword argument 'user'

这是我班的MRO

<class 'account.forms.EmailAddForm'>,
<class 'djangular.forms.angular_model.NgModelFormMixin'>,
<class 'djangular.forms.angular_validation.NgFormValidationMixin'>,
<class 'djangular.forms.angular_base.NgFormBaseMixin'>,
<class 'allauth.account.forms.AddEmailForm'>,
<class 'allauth.account.forms.UserForm'>,
<class 'django.forms.forms.Form'>,
<class 'django.forms.forms.NewBase'>,
<class 'django.forms.forms.BaseForm'>,
<type 'object'>

这些是每个类的__init__方法的签名

class NgModelFormMixin(NgFormBaseMixin):
    def __init__(self, data=None, *args, **kwargs):
       ...

class NgFormValidationMixin(NgFormBaseMixin):
    def __init__(self, *args, **kwargs):
       ...

class NgFormBaseMixin(object):
    def __init__(self, data=None, *args, **kwargs):
       ...

class NgFormBaseMixin(object):
    def __init__(self, data=None, *args, **kwargs):
       ...

class AddEmailForm(UserForm):
    ...

class UserForm(forms.Form):
    def __init__(self, user=None, *args, **kwargs):
       self.user = user
       super(UserForm, self).__init__(*args, **kwargs)

class BaseForm(object)
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
             initial=None, error_class=ErrorList, label_suffix=None,
             empty_permitted=False):
        ...

问题

有没有一种方法可以解决这个问题,而不必使用monkey修补UserForm.__init__方法?你知道吗

编辑

抱歉,我应该提到我理解导致错误的原因-在UserForm.__init__方法签名中显式使用user=None。这是第三方应用程序中包含的逻辑。你知道吗


Tags: 方法selfnonedataobjectinitdefargs
2条回答

问题是函数定义打乱了位置参数的顺序。在所有子类和父类中,data是第一个位置参数。在UserForm中,data仍然是第一个位置参数,但它由user参数捕获。如果user也包含在关键字参数中,则会出现该错误。你知道吗

一个简单的解决方案是只使用关键字参数。这样就不会有位置参数与关键字参数冲突。你知道吗

如果这超出了您的控制范围,您可以重写__init__方法并将所有位置参数映射到它们相应的关键字参数。你知道吗

似乎您在*args中简单地传递了user参数,或在UserForm中传递了**kwargs参数。你知道吗

相关问题 更多 >