possible attribute-oriented class
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sat Sep 5 05:57:35 EDT 2009
On Fri, 04 Sep 2009 22:51:39 -0700, Ken Newton wrote:
> On Fri, Sep 4, 2009 at 9:49 PM, Steven
> D'Aprano<steve at remove-this-cybersource.com.au> wrote: ...
>>
>>> The old discussion, the above link points to, shows that such a
>>> dot-accessible dict-like class is something that many people need and
>>> repeatedly implemet it (more or less perfectly) for themselves.
>>
>> I think it's something which people copy from other languages because
>> that's what they're used to, not because they need it.
>>
>> It's just a change in syntax. Whether you write x.key or x['key'] is a
>> matter of convenience. Attribute access is optimized for when you know
>> the key names at compile time, key access is optimized for when you
>> don't know the names until runtime. Compare:
>>
>> # You know the key when you write the code. x.key versus x['key']
>>
>> # You don't know the key until runtime. s = get_key()
>> getattr(x, s) versus x[s]
> ...
>
> I would think this is much more than just copy from other language
> styles or 'just' a syntax change -- the apparent widespread use would
> hint at a deeper need.
"Apparent" is the key word there. There are lots of people who *say* this
this useful functionality, but how many of them *actually* use it? And of
those who do use it, how many of them know what they're doing? There are
an awful lot of bad programmers out there.
If you do need such functionality, it's easy to implement. Here's one:
http://code.activestate.com/recipes/502219/
No comment, no votes.
Here's another:
http://code.activestate.com/recipes/361668/
Four comments, mostly negative, no votes.
To me, this seems like a superficially attractive idea which is actually
a bad idea, even when it's useful. Using a screwdriver as a chisel, or
crowbar is useful too, and I've done so myself, but it's still usually a
bad idea.
Key lookup and attribute access are superficially similar, and they're
implemented the same way in Python, but they're actually for different
conceptual purposes. Attributes are conceptually part of the object,
while key/values are conceptually data attached to the object. As a
general rule, if obj.x is an attribute, then every valid obj should have
an attribute x. But if obj['x'] is a key/value, then it is data-specific:
some instances will have an 'x' key, and some won't. Consequently,
obj.has_key('x') (better written these days as 'x' in obj) will be MUCH
more common than hasattr(obj, 'x').
For example, dict.clear has a special meaning shared by all dicts.
dict['clear'] does not. You confuse the two at your peril.
--
Steven
More information about the Python-list
mailing list