Namedtuples: some unexpected inconveniences
Deborah Swanson
python at deborahswanson.net
Fri Apr 14 20:14:45 EDT 2017
MRAB wrote, on Friday, April 14, 2017 2:19 PM
>
> In the line:
>
> values = {row[label] for row in group}
>
> 'group' is a list of records; row is a record (namedtuple).
>
> You can get the members of a namedtuple (also 'normal' tuple) by
numeric
> index, e.g. row[0], but the point of a namedtuple is that you can get
> them by name, as an attribute, e.g. row.Location.
>
> As the name of the attribute isn't fixed, but passed by name, use
> getattr(row, label) instead:
>
> values = {getattr(row, label) for row in group}
>
> As for the values:
>
> # Remove the missing value, if present.
> values.discard('')
>
> # There's only 1 value left, so fill in the empty places.
> if len(values) == 1:
> ...
Thanks for this, but honestly, I'm namedtupled-out at the moment and I
have several other projects I'd like to be working on. But I saved your
suggestion with ones that others have made, so I'll revisit yours again
when I come back for another look at namedtuples.
> The next point is that namedtuples, like normal tuples, are immutable.
> You can't change the value of an attribute.
No you can't, but you can use
somenamedtuple._replace(kwargs)
to replace the value. Works just as well.
More information about the Python-list
mailing list