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/