[Python-ideas] Trial balloon: adding variable type declarations in support of PEP 484

Guido van Rossum guido at python.org
Mon Aug 8 17:28:54 EDT 2016


On Mon, Aug 8, 2016 at 2:11 PM, אלעזר <elazarg at gmail.com> wrote:

> Feels like named parameters are better off being an OrderedDict in the
> first place.
>

PEP 468.


> NamedTuple pushes OrderedDict to become kind of builtin.
>

Why? Having both in the collections module is good enough.

>
> On Tue, Aug 9, 2016 at 12:09 AM Guido van Rossum <guido at python.org> 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, אלעזר <elazarg at 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 <guido at 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, אלעזר <elazarg at 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-ideas at 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)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160808/7035f383/attachment-0001.html>


More information about the Python-ideas mailing list