我有接受字典或其他对象的方法以及从这些对象中获取的“字段”的名称。如果对象是 dict,则该方法用于__getitem__
检索命名键,否则它用于getattr
检索命名属性。这在 Web 模板语言中很常见。例如,在Chameleon模板中,您可能有:
<p tal:content="foo.keyname">Stuff goes here</p>
如果您foo
以 dict 之类的形式传入{'keyname':'bar'}
,则foo.keyname
获取“keyname”键以获取“bar”。Iffoo
是一个类的实例,例如:
class Foo(object):
keyname = 'baz'
然后foo.keyname
从keyname
属性中获取值。Chameleon 本身实现了该功能(在chameleon.py26
模块中),如下所示:
def lookup_attr(obj, key):
try:
return getattr(obj, key)
except AttributeError as exc:
try:
get = obj.__getitem__
except AttributeError:
raise exc
try:
return get(key)
except KeyError:
raise exc
我已经在自己的包中实现了它,例如:
try:
value = obj[attribute]
except (KeyError, TypeError):
value = getattr(obj, attribute)
问题是,这是一个很常见的模式。我已经在很多模块中看到过这种方法或与之非常相似的方法。那么为什么在语言的核心中没有类似的东西,或者至少在一个核心模块中呢?如果做不到这一点,是否有明确的方式来说明应该如何编写?