考虑以下代码段:
dikt = {
"City": "Denver",
"State": "Colorado",
"Street": "123 Nowhere St."
}
kal = wrap(dikt)
assert(kal("City") == dikt["City"])
assert(kal("State") == dikt["State"])
实现wrap
函数的最简单方法是什么?我们希望包装器的__call__
方法调用包装对象__getitem__
方法。
在直接的情况下简单就是实现基本的包装类别,该类别在这些术语中定义了 __call__
:
class wrap:
def __init__(self, mapping):
self.mapping = mapping
def __call__(self, x):
return self.mapping[x]
略短(至少在cpython上,稍快地呼叫(,但是使用闭合的功能工厂较少,可配置/可检查/可扩展是:
def wrap(mapping):
def wrapped(x):
return mapping[x]
return wrapped
最后,最简单的(但最不配合(,直接返回绑定的 __getitem__
:
def wrap(mapping):
return mapping.__getitem__
或使用现有工具将绑定到C(无论如何还是在CPYTHON上(:
from operator import attrgetter
wrap = attrgetter('__getitem__')
在这里没有对最终可呼叫的实际定义,您只是在绑定现有方法并返回。