问题与第三方__init__ kwarg安置

时间:2014-06-30 11:11:29

标签: python django

背景

我试图合并(通过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):
        ...

问题

有没有办法解决这个问题,而无需使用猴子修补UserForm.__init__方法?

修改

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

2 个答案:

答案 0 :(得分:0)

您似乎在 UserForm .__ init __ 方法中的 * args ** kwargs 参数中传递了用户参数implecilty。

答案 1 :(得分:0)

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

对此的一个简单解决方案是仅使用关键字参数。然后,没有位置参数可以改变可以与关键字参数冲突的位置。

如果这超出了您的控制范围,您可以覆盖__init__方法并将所有位置参数映射到其对应的关键字参数。