dictやその他のオブジェクトを受け入れるメソッドと、それらのオブジェクトからフェッチする「フィールド」の名前があります。オブジェクトがdictの場合、メソッドは__getitem__
名前付きキーを取得するために使用します。そうでない場合はgetattr
、名前付き属性を取得するために使用します。これは、Webテンプレート言語ではかなり一般的です。たとえば、カメレオンテンプレートでは、次のようになります。
<p tal:content="foo.keyname">Stuff goes here</p>
foo
のようなdictとして渡す場合は、「keyname」キーをフェッチして「bar」を取得します{'keyname':'bar'}
。が次のようなクラスのインスタンスである場合foo.keyname
:foo
class Foo(object):
keyname = 'baz'
次にfoo.keyname
、属性から値をフェッチしkeyname
ます。カメレオン自体は、次の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)
問題は、それはかなり一般的なパターンです。多くのモジュールで、その方法またはそれに非常によく似た方法を見てきました。では、なぜ言語のコア、または少なくともコアモジュールの1つにそのようなものがないのですか?それができない場合、それをどのように書くべきかについての決定的な方法はありますか?