
On 1/30/2012 1:49 PM, Massimo Di Pierro wrote:
Trying to make sure I understand where we disagree... class Dummy(object): pass
d = Dummy() d.something = 5 print d.something
Is anybody calling this un-pythonic?
I already suggested that that is the way to make a pure *name* to data mapping object. If you want a default data object, add your corrected method: def __getattr__(self,key): return self.__dict__.get(key,None) To make Dummy instances key iterable like dicts, add def __iter__(self): return iter(self.__dict__) If you prefer to iterate by name-object pairs: def __iter__(self): return iter(self.__dict__.items()) One could define a few other special methods, like __eq__, to tie into other syntax.
STEP 2) We can now overload the [] to make the dynamic attributes accessible in an alternative syntax:
class Dummy(object): def __getitem__(self,key): return getattr(self,key) def __setitem__(self,key,value): return setattr(self,key,value)
Is anybody calling this un-pythonic?
Guido already did, insofar as he defines 'pythonic'. Anyway, skip that word. This is where many of us 'disagree'. This design redefines Dummy as a *string* to data mapping object. You add a second access method that makes the first access method only partial. To me, it is a conceptually crazy object. And it gets worse when you try to make it a dict, with some names now reserved for methods. Dicts, lists, and tuples have a clean separation between contents, accessed by subscript, and methods to work on contents, accessed as attributes. Many of us consider that a virtue and a feature. -- Terry Jan Reedy