gpt4 book ai didi

python - 签名中的显式参数不起作用?很奇怪

转载 作者:行者123 更新时间:2023-11-30 23:50:51 25 4
gpt4 key购买 nike

我试图理解为什么显式指定签名参数不起作用,但只是盲目地执行 *args, **kwargs 有效!我真的没看出两者有什么区别?

不起作用的示例:

from django.db.models import CharField as _CharField

class CharField(_CharField):
def get_db_prep_value(self, value, connection, prepared=False):
if self.blank == self.null == self.unique == True and value == '':
value = None

return super(CharField, self).get_db_prep_value(value, connection, prepared) # <--- this does not work!

我收到以下错误:

  File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 276, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
File "/home/googledroid/Workspace/eclipse/gameproject/src/fields/__init__.py", line 13, in get_db_prep_value
return super(CharField, self).get_db_prep_value(value, connection, prepared)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
TypeError: get_db_prep_value() got multiple values for keyword argument 'connection'

虽然这工作得很好:

from django.db.models import CharField as _CharField

class CharField(_CharField):
def get_db_prep_value(self, value, *args, **kwargs):
if self.blank == self.null == self.unique == True and value == '':
value = None

return super(CharField, self).get_db_prep_value(value, *args, **kwargs)

在 django 源代码中,django.db.models.subclassing.call_with_connection_and_prepared.inner(),我看到有一些 kwargs 的删除,但不完全确定为什么?

最佳答案

问题是,connection 参数应该始终作为关键字参数传入。 django.db.models.fields.subclassing 中的代码仅检查它是否存在于 kwargs 字典中,如果不存在,则会发出 DeprecationWarning > 并将其添加到其中。不检查位置参数,因此最终发生的情况是,您传递的位置参数都被转发,但函数包装器默认提供的关键字参数也被传入。因此发生了冲突。

要使您的代码正常工作,您需要做的就是:

        return super(CharField, self).get_db_prep_value(value, connection=connection, prepared=prepared)

仅供引用,在开发版本中,所有这些包装器都已被删除,这意味着您当前的代码可能适用于主干。但是,最好将参数保留在 kwargs 中。

关于python - 签名中的显式参数不起作用?很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068057/

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