Sounds like you're thinking with your runtime hat on, not your type checker
hat. :-)

On Tue, Aug 9, 2016 at 9:46 PM, Neil Girdhar <mistersh...@gmail.com> wrote:

> With PEP 520 accepted, would it be possible to iterate over
> __definition_order__?
>
> class PrototypeNamedTuple:
>     cache = {}
>     def __new__(cls, *args):
>         P = PrototypeNamedTuple
>         if cls not in P.cache:
>             P.cache[cls] = typing.NamedTuple(cls.__name__,
>
> [(definition, cls.__annotations__[definition])
> for definition in cls.__definition_order__]
>
> )
>         return P.cache[cls](*args)
>
> On Monday, August 8, 2016 at 5:09:50 PM UTC-4, Guido van Rossum wrote:
>>
>> Hm, overlooking the ordering is kind of a big deal for something with
>> "tuple" in its name. :-)
>>
>> Also it feels like it needs a metaclass instead of a cache.
>>
>> Maybe from this we can learn though that __anotations__ should be an
>> OrderedDict?
>>
>> On Mon, Aug 8, 2016 at 1:58 PM, אלעזר <ela...@gmail.com> wrote:
>>
>>> class PrototypeNamedTuple:
>>>     cache = {}
>>>     def __new__(cls, *args):
>>>         P = PrototypeNamedTuple
>>>         if cls not in P.cache:
>>>             P.cache[cls] = typing.NamedTuple(cls.__name__,
>>> cls.__annotations__.items())
>>>         return P.cache[cls](*args)
>>>
>>> Works modulo ordering, though I'm not sure that's the right way to do it.
>>>
>>> The ordering part of namedtuple is orthogonal to the
>>> value-type/immutability part. So I would imagine making "Value" for the
>>> latter, "tuple" for the former, and namedtuple is mixing both (possibly
>>> given a convenient name, such as PrototypeNamedTuple). "Value" can also
>>> seen as mixing "Struct" and "Immutable", but that's overdoing it I guess.
>>>
>>> ~Elazar
>>>
>>> On Mon, Aug 8, 2016 at 11:25 PM Guido van Rossum <gu...@python.org>
>>> wrote:
>>>
>>>> That's a very interesting idea and one that deserves pursuing (though I
>>>> agree it's not a blocker for the PEP I'm hoping to write). I think the next
>>>> step is to prototype this -- which can only happen once we have an
>>>> implementation of the PEP. Though perhaps you could start by writing a
>>>> prototype that works by having the user write the following:
>>>>
>>>> class Starship(PrototypeNamedTuple):
>>>>     damage = 0
>>>>     captain = "Kirk"
>>>>     __annotations__ = dict(damage=int, captain=str)
>>>>
>>>> It could also benefit from PEP 520 (Preserving Class Attribute
>>>> Definition Order).
>>>>
>>>> Who's game?
>>>>
>>>> --Guido
>>>>
>>>> On Mon, Aug 8, 2016 at 1:13 PM, אלעזר <ela...@gmail.com> wrote:
>>>>
>>>>> class Starship:
>>>>>>     stats: class Dict[str, int] = {}  # Pure class variable
>>>>>>     damage: class int = 0  # Hybrid class/instance variable
>>>>>>     captain: str  # Pure instance variable
>>>>>>
>>>>>
>>>>> I can't avoid noting that there is an opportunity here to insert
>>>>> NamedTuple into the core language. The above example is almost there,
>>>>> except it's mutable and without convenient methods. But
>>>>>
>>>>> class Starship(tuple):
>>>>>     damage: int = 0
>>>>>     captain: str  = "Kirk"
>>>>>
>>>>> Is an obvious syntax for
>>>>>
>>>>>     Starship = NamedTuple('Starship', [('damage', int), ('captain',
>>>>> str)])
>>>>>
>>>>> Only much more available and intuitive to read, use, and of course -
>>>>> type check.
>>>>> (Of course, it does mean adding semantics to the declaration syntax in
>>>>> general)
>>>>>
>>>>> I'm not really suggesting to make this change now, but I believe it
>>>>> will be done, sooner or later. My brief experience with mypy convinced me
>>>>> that it must be the case. The new declaration syntax only makes it easier.
>>>>>
>>>>> ~Elazar
>>>>>
>>>>> _______________________________________________
>>>>> Python-ideas mailing list
>>>>> python...@python.org
>>>>> https://mail.python.org/mailman/listinfo/python-ideas
>>>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> --Guido van Rossum (python.org/~guido)
>>>>
>>>
>>
>>
>> --
>> --Guido van Rossum (python.org/~guido)
>>
>


-- 
--Guido van Rossum (python.org/~guido)
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to