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

אלעזר elazarg at gmail.com
Mon Aug 8 17:11:58 EDT 2016


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

NamedTuple pushes OrderedDict to become kind of builtin.

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)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160808/e5795379/attachment.html>


More information about the Python-ideas mailing list