all() is slow?

Terry Reedy tjreedy at udel.edu
Thu Nov 10 14:25:40 EST 2011


On 11/10/2011 3:51 AM, Devin Jeanpierre wrote:

>> Because Python doesn't allow "--" to be an attribute name, and so
>> namedtuple doesn't let you try:
>>
>> t = namedtuple("T", "foo -- bar")(1, 2, 3)
>> print(t.foo)
>> print(t.--)
>> print(t.bar)
>
> '--' is a valid attribute name on virtually any object that supports
> attribute setting (e.g. function objects).

ob.-- is not valid Python because '--' is not a name.

 > Of course, you need to use setattr() and getattr().

I consider the fact that CPython's setattr accepts non-name strings to 
be a bit of a bug. Or if you will, leniency for speed. (A unicode name 
check in Py3 would be much more expensive than an ascii name check in 
Py2.) I would consider it legitimate for another implementation to only 
accept names and to use a specialized name_dict for attribute dictionaries.

So I consider it quite legitimate for namedtuple to requires real names 
for the fields. The whole point is to allow ob.name access to tuple 
members. Someone who plans to use set/getattr with arbitrary strings 
should just use a dict instead of a tuple.

-- 
Terry Jan Reedy




More information about the Python-list mailing list