gpt4 book ai didi

python - 类似字典的对象,没有 __getitem__、__setitem__

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

如果你这样做

import gdbm
db = gdbm.open('foo', 'cs')

你得到一个对象:

<gdbm.gdbm at 0x7f0982b9aef0>

您现在可以通过以下方式在数据库中设置键和值:

db['foo'] = 'bar'
print db['foo']

我想使用 Twisted 中的这些并为 __getitem__ 制作一个包装器和__setitem__返回延迟。然而,我注意到一些奇怪的事情:

In [42]: dir(db)
Out[42]: ['close', 'firstkey', 'has_key', 'keys', 'nextkey', 'reorganize', 'sync']

该对象没有 __getitem____setitem__ 。尝试其中任何一个都会导致属性访问错误。然而,它的行为就像一本字典。这是什么样的物体?

(我怀疑这是一个 C 扩展对象,但我发现奇怪的是它具有类似 dict 的访问方法,但没有 __getitem____setitem__ 方法。指向描述此行为的 Python 文档的指针会有所帮助。 )

进一步:如何获得对 db.__getitem__ 的引用和db.__setitem__如果你想将它们包装在延迟中?我看到的唯一解决方案是将数据库包装在实用程序类中:

class Db:
def __init__(self, db):
self.db = db

def __getitem__(self, x):
return self.db[x]

...

但也许我遗漏了一些明显的东西?

最佳答案

gdbm 确实是一个 C 模块;该对象实现了 C-API mapping protocol相反。

请参阅source code对于带有函数指针的 PyMappingMethods 结构。

您可以使用operator.getitem()访问 key :

>>> from operator import getitem
>>> db['foo'] = 'bar'
>>> getitem(db, 'foo')
'bar'

您可以将 getitem() 包装在 functools.partial() 中使其成为具有一个参数的高效可调用对象:

>>> from functools import partial
>>> gi = partial(getitem, db)
>>> gi('foo')
'bar'

由于 getitempartial 是用 C 实现的,因此该组合始终比包装访问的自定义对象、函数或 lambda 更快。

关于python - 类似字典的对象,没有 __getitem__、__setitem__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215228/

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