我喜欢Python的外观/手感,我希望它能更干净(可读性很棒).
在重写子类init(其中super()
调用中必须使用可选kwarg
)时,接受可选关键字参数的干净方法是什么?
我有一个Django表单,其中我想接受一个可选的用户参数,但是如果我将其定义为参数user=None
之一,那么通常的形式调用form({})
假定位置参数引用关键字参数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)
谢谢大家的意见!