我喜欢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)