KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have methods that accept dicts or other objects and the names of "fields" to fetch from those objects. If the object is a dict then the method uses __getitem__ to retrieve the named key, or else it uses getattr to retrieve the named attribute. This is pretty common in web templating languages. For example, in a Chameleon template you might have: <p tal:content="foo.keyname">Stuff goes here</p> If you pass in foo as a dict like {'keyname':'bar'} , then foo.keyname fetches the 'keyname' key to get 'bar'. If foo is an instance of a class like: class Foo(object): keyname = 'baz' then foo.keyname fetches the value from the keyname attribute. Chameleon itself implements that function (in the chameleon.py26 module) like this: 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 I've implemented it in my own package like: try: value = obj[attribute] except (KeyError, TypeError): value = getattr(obj, attribute) The thing is, that's a pretty common pattern. I've seen that method or one awfully similar to it in a lot of modules. So why isn't something like it in the core of the language, or at least in one of the core modules? Failing that, is there a definitive way of how that could should be written?
Tags (comma-separated)
Save Edits
Cancel