“冻结的字典”会是什么?是?
- 冻结集就是冻结集。
- 冻结列表可以是一个元组。
- 冻结的字典会是什么?一个不可变的、可散列的字典。
我猜它可能类似于collections.namedtuple
,但这更像是一个冻结键字典(半冻结字典)。不是吗?
一个“frozendict”应该是一个冻结字典,它应该有keys
,values
,get
等,并且支持in< /code>、
for
等
更新:
* 就在那里: https://www.python.org/dev/peps/pep- 0603
- A frozen set is a frozenset.
- A frozen list could be a tuple.
- What would a frozen dict be? An immutable, hashable dict.
I guess it could be something like collections.namedtuple
, but that is more like a frozen-keys dict (a half-frozen dict). Isn't it?
A "frozendict" should be a frozen dictionary, it should have keys
, values
, get
, etc., and support in
, for
, etc.
update :
* there it is : https://www.python.org/dev/peps/pep-0603
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
您可以使用
frozendict
://pypi.python.org/pypi/utilspie" rel="noreferrer">utilspie
包为:根据 文档:
You may use
frozendict
fromutilspie
package as:As per the document:
namedtuple
的主要缺点是需要在使用之前指定它,因此对于单一用例来说不太方便。然而,有一个实用的解决方法可以用来处理许多此类情况。假设您想要有一个与以下字典相同的不可变等价物:
这可以像这样模拟:
甚至可以编写一个辅助函数来自动执行此操作:
当然,这仅适用于平面字典,但不应该太很难实现递归版本。
The main disadvantage of
namedtuple
is that it needs to be specified before it is used, so it's less convenient for single-use cases.However, there is a practical workaround that can be used to handle many such cases. Let's say that you want to have an immutable equivalent of the following dict:
This can be emulated like this:
It's even possible to write an auxiliary function to automate this:
Of course this works only for flat dicts, but it shouldn't be too difficult to implement a recursive version.
是的,这是我的第二个答案,但这是一种完全不同的方法。第一个实现是用纯 python 实现的。这是在 Cython 中。如果您知道如何使用和编译 Cython 模块,这与常规字典一样快。检索单个值大约需要 0.04 到 0.06 微秒。
这是文件“frozen_dict.pyx”
这是文件“setup.py”
如果您安装了 Cython,请将上面的两个文件保存到同一目录中。在命令行中移至该目录。
你应该完成了。
Yes, this is my second answer, but it is a completely different approach. The first implementation was in pure python. This one is in Cython. If you know how to use and compile Cython modules, this is just as fast as a regular dictionary. Roughly .04 to .06 micro-sec to retrieve a single value.
This is the file "frozen_dict.pyx"
Here's the file "setup.py"
If you have Cython installed, save the two files above into the same directory. Move to that directory in the command line.
And you should be done.
freeze 实现冻结集合(dict、list 和 set),这些集合是可散列的、类型提示的并且会递归冻结您为您提供给他们(如果可能)的数据。
用法:
freeze implements frozen collections (dict, list and set) that are hashable, type-hinted and will recursively freeze the data you give them (when possible) for you.
Usage:
我需要在某个时刻访问某些东西的固定键,这是一种全局恒定的东西,我决定这样做:
像警告一样使用它
:我不建议在大多数用例中这样做,因为它使得一些相当严格的权衡。
I needed to access fixed keys for something at one point for something that was a sort of globally-constanty kind of thing and I settled on something like this:
Use it like
WARNING: I don't recommend this for most use cases as it makes some pretty severe tradeoffs.
Python 没有内置的 freezedict 类型。事实证明,这不会太频繁地有用(尽管它仍然可能比
frozenset
更有用)。需要这种类型的最常见原因是当记忆函数调用具有未知参数的函数时。存储 dict 的可哈希等价物(其中值可哈希)的最常见解决方案类似于 tuple(sorted(kwargs.items())) 。
这取决于排序是否有点疯狂。 Python 不能肯定地保证排序会产生合理的结果。 (但它不能承诺太多其他内容,所以不要太担心。)
您可以很容易地制作某种类似于字典的包装器。它可能看起来像这样(在 Python 3.10 及更高版本中,将
collections.Mapping
替换为collections .abc.Mapping
):它应该工作得很好:
Python doesn't have a builtin frozendict type. It turns out this wouldn't be useful too often (though it would still probably be useful more often than
frozenset
is).The most common reason to want such a type is when memoizing function calls for functions with unknown arguments. The most common solution to store a hashable equivalent of a dict (where the values are hashable) is something like
tuple(sorted(kwargs.items()))
.This depends on the sorting not being a bit insane. Python cannot positively promise sorting will result in something reasonable here. (But it can't promise much else, so don't sweat it too much.)
You could easily enough make some sort of wrapper that works much like a dict. It might look something like (In Python 3.10 and later, replace
collections.Mapping
withcollections.abc.Mapping
):It should work great:
奇怪的是,尽管我们有很少有用的
frozenset
,但仍然没有冻结映射。这个想法在 PEP 416 -- 添加 freezedict 内置类型 中被拒绝。这个想法可能会在以后的 Python 版本中重新审视,请参阅 PEP 603 -- 添加 freezemap 类型到集合。因此,Python 2 的解决方案:
似乎仍然是常见的:
在 Python 3 中,您可以选择 this:
现在默认配置可以动态更新,但在您希望通过传递代理来保持不可变的情况下保持不可变。
因此,
default_config
中的更改将按预期更新DEFAULTS
,但您无法写入映射代理对象本身。诚然,它与“不可变、可散列字典”实际上并不相同,但它可能是 freezedict 某些用例的不错替代品。
Curiously, although we have the seldom useful
frozenset
, there's still no frozen mapping. The idea was rejected in PEP 416 -- Add a frozendict builtin type. This idea may be revisited in a later Python release, see PEP 603 -- Adding a frozenmap type to collections.So the Python 2 solution to this:
Still seems to be the usual:
In Python 3 you have the option of this:
Now the default config can be updated dynamically, but remain immutable where you want it to be immutable by passing around the proxy instead.
So changes in the
default_config
will updateDEFAULTS
as expected, but you can't write to the mapping proxy object itself.Admittedly it's not really the same thing as an "immutable, hashable dict", but it might be a decent substitute for some use cases of a frozendict.
假设字典的键和值本身是不可变的(例如字符串),那么:
Assuming the keys and values of the dictionary are themselves immutable (e.g. strings) then:
普通Python中没有
frozendict
,但您可以使用types.MappingProxyType
已添加到 Python 3.3 中的标准库中:There is no
frozendict
in plain Python, but you can usetypes.MappingProxyType
that was added to the standard library in Python 3.3:安装 frozendict
使用它!
Install frozendict
Use it!
每当我编写这样的函数时,我都会想到 freezedict:
I think of frozendict everytime I write a function like this:
这是我一直在使用的代码。我对 freezeset 进行了子类化。这样做的优点如下。
2015 年 1 月 21 日更新:我在 2014 年发布的原始代码使用 for 循环来查找匹配的键。那速度太慢了。现在我已经整合了一个利用 freezeset 哈希功能的实现。键值对存储在特殊容器中,其中
__hash__
和__eq__
函数仅基于键。与我在 2014 年 8 月在这里发布的代码不同,此代码也经过了正式的单元测试。麻省理工学院风格的许可证。
Here is the code I've been using. I subclassed frozenset. The advantages of this are the following.
Update Jan 21 2015: The original piece of code I posted in 2014 used a for-loop to find a key that matched. That was incredibly slow. Now I've put together an implementation which takes advantage of frozenset's hashing features. Key-value pairs are stored in special containers where the
__hash__
and__eq__
functions are based on the key only. This code has also been formally unit-tested, unlike what I posted here in August 2014.MIT-style license.
子类化
dict
我在野外看到了这种模式(github)并想提及它:
示例用法:
优点
get()
, < code>keys()、items()
(py2 上的iteritems()
)以及来自dict
的所有好东西box 没有显式实现它们dict
这意味着性能(dict
是用 CPython 中的 c 语言编写的)isinstance(my_frozen_dict, dict)< /code> 返回 True - 尽管 python 鼓励 duck-typing 许多包使用
isinstance()
,这可以节省许多调整和自定义缺点
__hash__
更快一点。Subclassing
dict
i see this pattern in the wild (github) and wanted to mention it:
example usage:
Pros
get()
,keys()
,items()
(iteritems()
on py2) and all the goodies fromdict
out of the box without explicitly implementing themdict
which means performance (dict
is written in c in CPython)isinstance(my_frozen_dict, dict)
returns True - although python encourages duck-typing many packages usesisinstance()
, this can save many tweaks and customizationsCons
__hash__
a bit faster.