我有接受字典或其他對象的方法以及從這些對象中獲取「字段」的名稱。如果對象是字典,則該方法使用__getitem__
來檢索指定的密鑰,否則它使用getattr
來檢索指定的屬性。這在網頁模板語言中很常見。例如,在一個Chameleon模板,你可能有:爲什麼Python沒有內置的混合getattr + __getitem__?
<p tal:content="foo.keyname">Stuff goes here</p>
如果您在foo
通過像{'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
我已經實現了它在my own package,如:
try:
value = obj[attribute]
except (KeyError, TypeError):
value = getattr(obj, attribute)
的事情是,這是一個很常見的模式。我已經在很多模塊中看到過這種方法或者非常相似的方法。那麼,爲什麼在語言的核心,或者至少在其中一個核心模塊中不是這樣?如果沒有,那麼應該如何編寫?有沒有確定的方法?
我強烈反對說:「事情是,這是一個很常見的模式」。顯式比顯式更好。屬性訪問完全可以通過鍵訪問... –
是的,但它在頁面模板語言等特定環境中仍然很常見。我已經看到了它(並且需要實現它),足以希望將其重構爲核心模塊或通用模塊。 –
沒有這樣的東西 - 可能是因爲Python開發人員不想強制使用錯誤的編程風格.... point ..如果你編寫不好的代碼,那麼你必須明確地寫出它....明確比隱含更好。 –