On 18 February 2013 11:47, John Reid <[email protected]> wrote:
> Hi,
>
> I was hoping namedtuples could be used as replacements for tuples in all
> instances.
namedtuples are not really intended to serves as tuples anywhere. They
are intended to provide lightweight, immutable, hashable objects with
*named* (rather than numbered) values.
> There seem to be some differences between how tuples and namedtuples are
> created. For example with a tuple I can do:
>
> a=tuple([1,2,3])
>
> with namedtuples I get a TypeError:
>
> from collections import namedtuple
> B=namedtuple('B', 'x y z')
> b=B([1,2,3])
For a namedtuple you need to unpack the arguments
b = B(*[1, 2, 3])
or
b = B(1, 2, 3)
>
> TypeError: __new__() takes exactly 4 arguments (2 given)
>> <ipython-input-23-d1da2ef851fb>(3)<module>()
> 1 from collections import namedtuple
> 2 B=namedtuple('B', 'x y z')
> ----> 3 b=B([1,2,3])
>
> I'm seeing this problem because of the following code in IPython:
>
> def canSequence(obj):
> if isinstance(obj, (list, tuple)):
> t = type(obj)
> return t([can(i) for i in obj])
> else:
> return obj
What is the point of the code above? If obj is a list or a tuple you
create a new list or tuple with the same data and then return it
otherwise you just return the object. What about:
def canSequence(obj):
return obj
Or is it that you want to copy the object (but only when it is a tuple
or list). Then how about
def canSequence(obj):
if isinstance(obj, (list, tuple)):
return obj[:]
else:
return obj
Note that this turns namedtuples into tuples. It might be better to
catch TypeError rather than special casing the types:
def canSequence(obj):
try:
return obj[:]
except TypeError:
return obj
Or perhaps it would be better to use the copy module (assuming that
the purpose is to copy the object).
>
> where obj is a namedtuple and t([can(i) for i in obj]) fails with the
> TypeError. See http://article.gmane.org/gmane.comp.python.ipython.user/10270
> for more info.
>
> Is this a problem with namedtuples, ipython or just a feature?
I think that it is a problem with the canSequence function.
Oscar
--
http://mail.python.org/mailman/listinfo/python-list