我喜欢蟒蛇的外观/感觉如何美丽,我希望这可以更清洁(可读性很棒).
什么是清洁的方式来推翻子类时要接受一个可选的关键字参数初始化,其中可选的kwarg,必须使用后的super()电话吗?
我有一个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)
Run Code Online (Sandbox Code Playgroud)
通过查看实际的Form类来查看它正在查找的参数,我可以使它成为最干净的,但是在python中对子类进行子类化的最大好处之一就是收集所有args并将kwargs其传递给任何子类.此外,这不会影响源中的任何更改.
def __init__(self, querydict=None, user=None):
super(BaseCheckoutForm, self).__init__(querydict)
if user:
self.prefill_from_user(user)
Run Code Online (Sandbox Code Playgroud)
但不幸的是我有:
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)
Run Code Online (Sandbox Code Playgroud)
感谢您的任何意见!
Joe*_*ton 56
我通常只是做你在这里做的事情.但是,您可以通过提供以下默认参数来缩短/清理代码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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31695 次 |
| 最近记录: |