我喜欢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中的任何东西进行子类化最棒的事情之一就是收集所有的argskwargs,并将其传递给您所子类化的任何东西.此外,这也不能支持源代码中的任何更改.

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)

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

仅更新模型中的特定字段.Model Django

Django显示交叉表格

如何显示日期?

基于Django类的视图:除非登录,否则拒绝访问future 日期

新的 Django 开发人员无法在网站上显示Hello World,而不是默认安装成功页面

在不指定查找的情况下调用 prefetch_lated() 有用吗?

Django REST框架中如何从另一个视图调用API视图?

如何根据状态计算表中数据的数量?

有谁知道是否可以将您的 Django Heroku 应用程序放到 App Store/Google Play 上?

基于模型多选字段在模板django中显示结果

如何在 django 的列表中查找所有对象作为对象?

Django 模型命名约定

Django:无法从另一个应用程序导入模型

Django Facebook Connect 应用推荐

Django:将原始html(来自数据库)显示为html,而不是呈现

如何在 Django 测试框架中修改会话

django 模板列表变量中的最后一个元素

AssertionError: `HyperlinkedIdentityField` 需要序列化程序上下文中的请求

如何动态访问 Django 模型字段详细名称?