gpt4 book ai didi

python - 初始化 QueryDict.fromkeys

转载 作者:太空狗 更新时间:2023-10-29 20:30:23 27 4
gpt4 key购买 nike

我们可以从键列表中初始化一个新的字典实例:

>>> dict.fromkeys(['spam', 'spam', 'potato'])
{'potato': None, 'spam': None}

querydict 是一个 dict,所以这应该可以,对吧?

>>> QueryDict.fromkeys(['spam', 'spam', 'potato'])
TypeError: __init__() takes at least 2 arguments (1 given)

当然我可以做一些像 QueryDict('spam&spam&potato') 这样蹩脚的事情,但我的问题是:.fromkeys 方法是完全可用还是完全损坏?

如果是前者,如何使用?如果是后者,为什么不在子类中明确禁用它?

最佳答案

问题还取决于 Django 版本。您使用的 Django 1.7.x 或更早版本需要 QueryDict 的位置参数 query_string。它在 Django 1.8 中得到修复,此参数是可选的。

第二个问题是 QueryDict 默认创建一个 immutable 实例并且没有办法通过 传递 mutable=True >从 key 。无法将键添加到不可变,并且该方法在 Django 1.8 中也失败。

可以这样解决:

from django.http.request import QueryDict

class MyQueryDict(QueryDict):

@classmethod
def fromkeys(cls, seq, value='', encoding=None):
result = cls('', mutable=True, encoding=encoding)
for key in seq:
result.appendlist(key, value) # or result.update(key, value)
return result

为了反射(reflect)重复键,实现比较复杂。默认值为空字符串,因为通过 urlencode() 将其转换为字符串 'None' 没有意义,例如 'potato=None&spam=None&spam=None'方法。默认结果 QueryDict 应与 QueryDict('potato&spam&spam') 相同。

提出的解决方案非常奇怪,raise NotImplemented() 将是一个更直接的“实现”。 (编辑:我不希望有更多有用的东西被 Django 代码库接受)但是我必须同意你的看法,这是一个带有神秘消息的错误。如果不需要警告说明,则未实现的功能通常是未记录的,因为它们可以找到无数。

其他解决方案是仅修改 __init__:

class MyQueryDict(QueryDict):

def __init__(self, query_string=None, mutable=True, encoding=None):
super(MyQueryDict, self).__init__(query_string=query_string,
mutable=mutable,
encoding=encoding)

因为不可变的 QueryDict 实例通常是不切实际的,甚至 Django 中一半的内部使用都是可变的 QueryDict 实例。

关于python - 初始化 QueryDict.fromkeys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640564/

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