- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果你这样做
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'
由于 getitem
和 partial
是用 C 实现的,因此该组合始终比包装访问的自定义对象、函数或 lambda 更快。
关于python - 类似字典的对象,没有 __getitem__、__setitem__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19215228/
我希望能够拦截函数内的变量赋值并执行自定义代码。我试过如下创建自定义字典: class userdict(dict): def __setitem__(self, key, value):
我正在尝试创建一个将数据存储在本地缓冲区中并充当数据库接口(interface)的类。我有以下代码: class Table(object): def __init__(self, ta
我在第 3 方模块中找到了这段代码,在这种情况下,该模块忽略了 foo[::step] 或 key.step。 def __getitem__(self, key): if isinstanc
我正在运行 Python 2.7.10。 我需要拦截列表中的更改。 “更改”是指任何在浅层意义上修改列表的内容(如果列表由相同顺序的相同对象组成,则列表不会更改,而不管这些对象的状态如何;否则,它是)
我有以下字典: class Only5Items(dict): def __setitem__(self, key, value): if len(self) < 5:
这是我所做的,尝试为类似 dict 的数据库创建一个包装器,以及其他功能: class database(object): def __init__(self, name):
我不想在使用 __setitem__ 时测试键的类型。但奇怪的是,我发现使用多个键时,部分代码被省略了。这是我的测试类: class foo(): def __init__(self):
我有一个 list 的子类这在列表的组件上添加了一些管理内容。一切正常,但 mypy投诉 super 的签名调用 __setitem__ . 这是问题减少到最低限度: from typing impo
在下面的示例中,如果通过 = 设置数据,则有一个具有 __setitem__ 方法的类可以正常工作。但是,如果例如 list 类型的数据是使用 .append 方法隐式设置的,则不会调用 __seti
在下面的示例中,如果通过 = 设置数据,则有一个具有 __setitem__ 方法的类可以正常工作。但是,如果例如 list 类型的数据是使用 .append 方法隐式设置的,则不会调用 __seti
如果你这样做 import gdbm db = gdbm.open('foo', 'cs') 你得到一个对象: 您现在可以通过以下方式在数据库中设置键和值: db['foo'] = 'bar' pr
我有以下类(class): class autoArray2(numpy.ndarray): def __new__(self, *args, **kwargs): obj =
我有以下代码: class VectorN(object): def __init__(self, param): if isinstance(param, int):
我正在构建一个子类 dict 并覆盖 __setitem__ 的类。我想确定在所有可能设置字典项的情况下都会调用我的方法。 我发现了三种情况,Python(本例中为 2.6.4)在设置值时不调用我重写
我试图实现一个(原型(prototype),而不是生产)版本的持久字典,它使用磁盘上的pickle作为持久存储。但是,pickle.load 出于自身目的调用 __setitem__ ,并且(当然)会
基于Paul's answer ,我尝试运行以下冒泡排序算法,该算法使用 slice 和 __setitem__ 方法;我确信有一些简单的事情我做得不对,不确定那可能是什么? 代码 def bubbl
在下面的语句中定义一个类的行为: my_object[item] = ... 我知道我需要定义 __setitem__ 方法。 下面的语句需要定义什么方法: my_object[item] += ..
谁能告诉我为什么这段代码提示容器上没有 __setitem__?我以为我只需要容器上的 __getitem__ 来获取项目,然后 __iadd__ 来设置值,不知道为什么它期待 __setitem__
我正在开发一个自定义类来使用 Python 处理矩阵。我遇到了一个问题,我的测试程序显然没有向我的 __setitem__ 方法传递足够的参数。这是代码: def __setitem__(self,
var obj = {} obj.__setitem__ = function(key, value){ this[key] = value * value } obj.x = 2 // 4 o
我是一名优秀的程序员,十分优秀!