当前位置: 首页 > 面试题库 >

Python-重写__init__的最简单方法,在super()调用之后必须使用可选的kwarg吗?

施辉
2023-03-14
问题内容

我喜欢python看起来/感觉如何漂亮,我希望它可以变得更干净(可读性很棒)。

什么是清洁的方式来推翻子类时要接受一个可选的关键字参数 初始化 ,其中可选的kwarg,必须使用 super()电话吗?

我有一个django表单,我想在其中接受一个可选的用户参数,但是如果我将其定义为参数之一user=None,则通常的表单调用会form({})假设位置参数引用了关键字arguments
user

代码胜于(我)的话:

def __init__(self, *args, **kwargs):
    user = None
    if 'user' in kwargs:
        user = kwargs.pop('user')
    super(BaseCheckoutForm, self).__init__(*args, **kwargs)
    if user:
        self.prefill_from_user(user)

我可以通过查看实际的Form类以查看其查找的内容来使其最干净,但是在python中对任何子类进行子类化的最大优点之一就是收集了所有内容args并将kwargs其传递给子类化的任何东西。同样,这并不能容纳源代码中的任何更改。

def __init__(self, querydict=None, user=None):
    super(BaseCheckoutForm, self).__init__(querydict)
    if user:
        self.prefill_from_user(user)

但不幸的是,我有:

 def __init__(self, *args, **kwargs):
    # cannot define user=None as an argument because normal usage
    # of class expects a certain order of positional args
    user = None
    if 'user' in kwargs:
        # must pop now since super()__init__ isn't expecting a user kwarg
        user = kwargs.pop('user') 
    super(BaseCheckoutForm, self).__init__(*args, **kwargs)
    if user:
        self.prefill_from_user(user)

感谢您的输入!


问题答案:

通常,我通常只是做您在这里所做的事情。但是,您可以通过为以下代码提供默认参数来缩短/清理代码dict.pop

 def __init__(self, *args, **kwargs):
    user = kwargs.pop('user', None)
    super(BaseCheckoutForm, self).__init__(*args, **kwargs)
    if user is not None:
        self.prefill_from_user(user)


 类似资料: