[Python-ideas] namedtuple literals [Was: RE a new namedtuple]
Brice PARENT
contact at brice.xyz
Thu Jul 20 02:50:13 EDT 2017
If the type is a data, it probably belongs to the inside of the tuple:
smart = (type="Car", cost=18_900, hp=89, weight=949)
harley = (type="Motorcycle", cost=18_900, hp=89, weight=949)
both_vehicles = (type(smart) == type(harley)) # True -
type+cost+hp+weight on both sides
same_vehicles = (smart == harley) # False - cost, hp and weight are
identical, but not type
Le 20/07/17 à 07:12, David Mertz a écrit :
> I'm concerned in the proposal about losing access to type information
> (i.e. name) in this proposal. For example, I might write some code
> like this now:
>
> >>> from collections import namedtuple
> >>> Car = namedtuple("Car", "cost hp weight")
> >>> Motorcycle = namedtuple("Motorcycle", "cost hp weight")
> >>> smart = Car(18_900, 89, 949)
> >>> harley = Motorcyle(18_900, 89, 949)
> >>> if smart==harley and type(smart)==type(harley):
> ... print("These are identical vehicles")
>
> The proposal to define this as:
>
> >>> smart = (cost=18_900, hp=89, weight=949)
> >>> harley = (cost=18_900, hp=89, weight=949)
>
> Doesn't seem to leave any way to distinguish the objects of different
> types that happen to have the same fields. Comparing
> `smart._fields==harley._fields` doesn't help here, nor does any type
> constructed solely from the fields.
>
> Yes, I know a Harley-Davidson only weighs about half as much as a
> SmartCar, although the price and HP aren't far off.
>
> I can think of a few syntax ideas for how we might mix in a "name" to
> the `ntuple` objects, but I don't want to bikeshed. I'd just like to
> have the option of giving a name or class that isn't solely derived
> from the field names.
>
>
> On Wed, Jul 19, 2017 at 9:06 PM, Nick Coghlan <ncoghlan at gmail.com
> <mailto:ncoghlan at gmail.com>> wrote:
>
> On 20 July 2017 at 11:35, Alexander Belopolsky
> <alexander.belopolsky at gmail.com
> <mailto:alexander.belopolsky at gmail.com>> wrote:
> > On Wed, Jul 19, 2017 at 9:08 PM, Guido van Rossum
> <guido at python.org <mailto:guido at python.org>> wrote:
> >> The proposal in your email seems incomplete
> >
> > The proposal does not say anything about type((x=1, y=2)). I assume
> > it will be the same as the type currently returned by
> namedtuple(?, 'x
> > y'), but will these types be cached? Will type((x=1, y=2)) is
> > type((x=3, y=4)) be True?.
>
> Right, this is one of the key challenges to be addressed, as is the
> question of memory consumption - while Giampaolo's write-up is good in
> terms of covering the runtime performance motivation, it misses that
> one of the key motivations of the namedtuple design is to ensure that
> the amortised memory overhead of namedtuple instances is *zero*, since
> the name/position mapping is stored on the type, and *not* on the
> individual instances.
>
> From my point of view, I think the best available answers to those
> questions are:
>
> - ntuple literals will retain the low memory overhead characteristics
> of collections.namedtuple
> - we will use a type caching strategy akin to string interning
> - ntuple types will be uniquely identified by their field names
> and order
> - if you really want to prime the type cache, just create a module
> level instance without storing it:
>
> (x=1, y=2) # Prime the ntuple type cache
>
> A question worth asking will be whether or not
> "collections.namedtuple" will implicitly participate in the use of the
> type cache, and I think the answer needs to be "No". The problem is
> twofold:
>
> 1. collections.namedtuple accepts an additional piece of info that
> won't be applicable for ntuple types: the *name*
> 2. collections.namedtuple has existed for years *without* implicit
> type caching, so adding it now would be a bit weird
>
> That means the idiomatic way of getting the type of an ntuple would be
> to create an instance and take the type of it: type((x=1, y=2))
>
> The could still be the same kind of type as is created by
> collections.namedtuple, or else a slight variant that tailors repr()
> and pickling support based on the fact it's a kind of tuple literal.
>
> Cheers,
> Nick.
>
> --
> Nick Coghlan | ncoghlan at gmail.com <mailto:ncoghlan at gmail.com>
> | Brisbane, Australia
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org <mailto:Python-ideas at python.org>
> https://mail.python.org/mailman/listinfo/python-ideas
> <https://mail.python.org/mailman/listinfo/python-ideas>
> Code of Conduct: http://python.org/psf/codeofconduct/
> <http://python.org/psf/codeofconduct/>
>
>
>
>
> --
> Keeping medicines from the bloodstreams of the sick; food
> from the bellies of the hungry; books from the hands of the
> uneducated; technology from the underdeveloped; and putting
> advocates of freedom in prisons. Intellectual property is
> to the 21st century what the slave trade was to the 16th.
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170720/a678b388/attachment-0001.html>
More information about the Python-ideas
mailing list