>
>
> > On the other hand, it might be an indication that a tuple is the wrong
> tool for the job.
>

maybe -- if I"m doing a lot of replacing, I likely would turn to a list --
but if you need an immutable, you need an immutable. I'm pretty sure I've
written code like:

temp = list(a_tuple)
temp[i] = new_value
a_tuple = tuple(temp)

and the OP's suggestion is buggy at the boundary:

In [204]: def replace1(tup, index, value):
     ...:     return tup[:index] + (value,) + tup[index+1:]
     ...:

In [205]: tup
Out[205]: (1, 2, 3, 4, 5)

In [206]: replace1(tup, 5, 100)
Out[206]: (1, 2, 3, 4, 5, 100)

And converting to a list and back is actually. a tad faster:

In [209]: def replace1(tup, index, value):
     ...:     return tup[:index] + (value,) + tup[index+1:]
     ...:

In [210]: def replace2(tup, index, value):
     ...:     temp = list(tup)
     ...:     temp[index] = value
     ...:     return tuple(temp)
     ...:

In [211]: %timeit replace1(tup, 3, 100)
402 ns ± 7.19 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [212]: %timeit replace2(tup, 3, 100)
319 ns ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Not every one or two line function needs to be in the stdlib, but short
functions that are easy to get wrong are good candidates :-)

> As noted, a namedtuple DOES allow you to replace one component, and to do
> so by name rather than knowing its index, so possibly that would be a
> better choice here.
>

maybe, but namedtuple is a lot more awkward and heavyweight -- and slower:

In [225]: NTup = namedtuple('NTup', ('one', 'two', 'three', 'four', 'five'))

In [226]: ntup = NTup(1,2,3,4,5)

In [227]: %timeit ntup._replace(three=100)
1.16 µs ± 38.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

I would never recommend a namedtuple for a situation where a tuple is a
fine choice other the the lack of a replace method.

Frankly, now that dataclasses are built in to the stdlib, I'll bet we'll
see fewer uses of namedtuple. Yes, I know they are very different beasts,
but I suspect a lot of folks used namedtuples because they wanted a simple
data structure with a few attributes -- and didn't need it to be a tuple,
or immutable. I may be wrong, it's purely conjecture.

-CHB

-- 
Christopher Barker, PhD (Chris)

Python Language Consulting
  - Teaching
  - Scientific Software Development
  - Desktop GUI and Web Development
  - wxPython, numpy, scipy, Cython
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/IZYH5XPBTDYRPQVTOVBDMQDALCFPXLIJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to