[Python-ideas] namedtuple literals [Was: RE a new namedtuple]

MRAB python at mrabarnett.plus.com
Tue Jul 25 15:30:14 EDT 2017


On 2017-07-25 19:48, Giampaolo Rodola' wrote:
>
> On Tue, Jul 25, 2017 at 7:49 PM, MRAB <python at mrabarnett.plus.com 
> <mailto:python at mrabarnett.plus.com>> wrote:
>
>     On 2017-07-25 02:57, Nick Coghlan wrote:
>
>         On 25 July 2017 at 02:46, Michel Desmoulin
>         <desmoulinmichel at gmail.com <mailto:desmoulinmichel at gmail.com>>
>         wrote:
>
>             Le 24/07/2017 à 16:12, Nick Coghlan a écrit :
>
>                 On 22 July 2017 at 01:18, Guido van Rossum
>                 <guido at python.org <mailto:guido at python.org>> wrote:
>
>                     Honestly I would like to declare the bare (x=1,
>                     y=0) proposal dead. Let's
>                     encourage the use of objects rather than tuples
>                     (named or otherwise) for
>                     most data exchanges. I know of a large codebase
>                     that uses dicts instead of
>                     objects, and it's a mess. I expect the bare ntuple
>                     to encourage the same
>                     chaos.
>
>
>             This is the people working on big code base talking.
>
>
>         Dedicated syntax:
>
>              (x=1, y=0)
>
>         New builtin:
>
>              ntuple(x=1, y=0)
>
>         So the only thing being ruled out is the dedicated syntax option,
>         since it doesn't let us do anything that a new builtin can't
>         do, it's
>         harder to find help on (as compared to "help(ntuple)" or searching
>         online for "python ntuple"), and it can't be readily backported to
>         Python 3.6 as part of a third party library (you can't easily
>         backport
>         it any further than that regardless, since you'd be missing the
>         order-preservation guarantee for the keyword arguments passed
>         to the
>         builtin).
>
>     [snip]
>
>     I think it's a little like function arguments.
>
>     Arguments can be all positional, but you have to decide in what
>     order they are listed. Named arguments are clearer than positional
>     arguments when calling functions.
>
>     So an ntuple would be like a tuple, but with names (attributes)
>     instead of positions.
>
>     I don't see how they could be compatible with tuples because the
>     positions aren't fixed. You would need a NamedTuple where the type
>     specifies the order.
>
>     I think...
>
>
> Most likely ntuple() will require keyword args only, whereas for 
> collections.namedtuple they are mandatory only during declaration. The 
> order is the same as kwargs, so:
>
> >>> nt = ntuple(x=1, y=2)
> >>> nt[0]
> 1
> >>> nt[1]
> 2
>
> What's less clear is how isinstance() should behave. Perhaps:
>
> >>> t = (1, 2)
> >>> nt = ntuple(x=1, y=2)
> >>> isinstance(nt, tuple)
> True
> >>> isinstance(t, ntuple)
> False

Given:

 >>> nt = ntuple(x=1, y=2)

you have nt[0] == 1 because that's the order of the args.

But what about:

 >>> nt2 = ntuple(y=2, x=1)

? Does that mean that nt[0] == 2? Presumably, yes.

Does nt == nt2?

If it's False, then you've lost some of the advantage of using names 
instead of positions.

It's a little like saying that functions can be called with keyword 
arguments, but the order of those arguments still matters!



More information about the Python-ideas mailing list