是否有理由使用get / put方法而不是项目访问?

时间:2010-07-16 00:13:41

标签: python interface mapping

我发现我最近在类上实现了Mapping接口,表面上适合模型(它们本质上只是键值存储而没有更多的元数据),但在它们下面它们有时非常复杂。

以下是一些增加严重程度的例子:

  1. 一个对象,它包含另一个映射,在设置时将所有对象转换为字符串。
  2. 使用本地数据库作为后端来存储键值对的对象。
  3. 向远程服务器发出HTTP请求以获取/设置数据的对象。
  4. 让我们假设所有这些示例都无缝地实现了Mapping接口,并且唯一的迹象表明存在可疑的事情是项目访问可能需要几秒钟,并且项目可能无法以与存储相同的形式检索(如果有的话)。我完全满足于第一个例子,第二个例子非常好,但是我对最后一个感到有些不舒服。

    问题是,这些模型的API是否应该不使用项目访问权限,即使底层结构可能感觉它适合表面?

2 个答案:

答案 0 :(得分:2)

听起来您正在描述标准的anydbm模块语义。正如anydbm可以引发异常anydbm.error一样,您的子类也可以根据需要提升MyDbmTimeoutError之类的衍生物。无论您将其实现为字典操作还是函数调用,调用者仍然必须与异常竞争(例如KeyErrorNameError)。

我认为Python 2和3.x中存在任意“绑定”哈希,这是说它是一种合理方法的正当理由。实际上,我一直在寻找(并在我的脑海中设计)比简单的键⇒值映射更复杂的绑定,而中间没有繁重的ORM SQL层。

添加:我想的越多,Pythonic绑定的词典就越多。键⇒值集合字典。它是存在于核心,磁盘还是整个网络中,是一个最佳抽象的实现细节。唯一的实质性差异是延迟增加和可能不可用;然而,在基于虚拟内存的操作系统上,“核心”可能具有比RAM更高的延迟,而在多处理操作系统中,“核心”也可能变得不可用。所以这些只是程度上的差异,而不是善意。

答案 1 :(得分:0)

从严格的哲学观点来看,我不认为你可以与之交叉。如果某个工具提供了所需的功能,但其API不同,请适应。你不应该这样做的唯一一次是,如果适应API只是表达不足以以所需的方式操纵适应的组件。

我会毫不犹豫地将数据库调整为dict,因为这是一种操作集合的好方法,而且它已经兼容了很多其他代码。如果我发现我的特定应用程序必须调用数据库连接begin()commit()rollback()方法才能正常工作,那么dict将无法执行,因为dict不会有交易语义。