gpt4 book ai didi

Python - 覆盖 __init__ 的最干净方法,其中在 super() 调用之后必须使用可选的 kwarg?

转载 作者:IT老高 更新时间:2023-10-28 21:49:29 24 4
gpt4 key购买 nike

我喜欢 Python 的美丽外观/感觉,我希望这可以更简洁(可读性很棒)。

在覆盖子类 init 时,接受可选关键字参数的简洁方法是什么,其中可选的 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)

我可以通过查看实际的 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)

关于Python - 覆盖 __init__ 的最干净方法,其中在 super() 调用之后必须使用可选的 kwarg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5031711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com