<div dir="ltr"><div>It's already possible to overload <span style="line-height:1.5">NamedTuple, in a way that will allow the following abuse of notation:</span></div><div><br></div><div>    @NamedTuple</div><div>    def Starship(damage:int, captain:str): pass</div><div><br></div>The 'def' is unfortunate and potentially confusing (although it *is* a callable definition), and the ": pass" is meaningless. But I think it is clear and concise if you know what NamedTuple is.<div><br><div>Introducing new keyword will of course solve both problems (if there's "async def", why not "type def"? :) ).<div><br></div><div><span style="line-height:1.5">     case class Starship(damage:int, captain:str)</span></div><div><br></div><div><div>Possible variations on the decorator theme:</div><div><br></div><div>"unordered" namedtuple (note the *)</div><div><br></div><div><div><span style="line-height:1.5">    @Value</span><br></div><div><div>    def Starship(*, damage:int, captain:str): pass</div><br class="inbox-inbox-Apple-interchange-newline"></div><div>self-describing (another level of notation abuse):</div><div><br></div><div><div>    @Type</div><div>    def Starship(damage:int, captain:str) -> <span style="line-height:1.5">NamedTuple</span><span style="line-height:1.5">: pass</span></div></div><div><br></div><div class="gmail_quote"><div dir="ltr">On Mon, Aug 8, 2016 at 11:25 PM Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div><div><div>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:<br><br></div>class Starship(PrototypeNamedTuple):<br></div>    damage = 0<br></div>    captain = "Kirk"<br></div>    __annotations__ = dict(damage=int, captain=str)<br><br></div>It could also benefit from PEP 520 (Preserving Class Attribute Definition Order).<br><br></div>Who's game?<br><br></div>--Guido<br></div><div class="gmail_extra"><br><div class="gmail_quote"></div></div><div class="gmail_extra"><div class="gmail_quote">On Mon, Aug 8, 2016 at 1:13 PM, אלעזר <span dir="ltr"><<a href="mailto:elazarg@gmail.com" target="_blank">elazarg@gmail.com</a>></span> wrote:<br></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">class Starship:<br>
    stats: class Dict[str, int] = {}  # Pure class variable<br>
    damage: class int = 0  # Hybrid class/instance variable<br>
    captain: str  # Pure instance variable<br></blockquote><div><span style="line-height:1.5"><br></span></div></span><div><span style="line-height:1.5">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</span><br></div><div><span style="line-height:1.5"><br></span></div><div>class Starship(tuple):<br>    damage: int = 0  <br>    captain: str  = "Kirk"<span style="line-height:1.5"><br></span></div><div><br></div><div>Is an obvious syntax for </div><div><br></div><div>    <span style="line-height:1.5">Starship = </span><span style="line-height:1.5">NamedTuple('</span><span style="line-height:1.5">Starship', [('damage', int), ('captain', str)])</span></div><div><span style="line-height:1.5"><br></span></div><div><span style="line-height:1.5">Only much more available and intuitive to read, use, and of course - type check.</span></div><div><span style="line-height:1.5">(Of course, it does mean adding semantics to the declaration syntax in general)</span></div><div><span style="line-height:1.5"><br></span></div><div><span style="line-height:1.5">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.</span></div><div><span style="line-height:1.5"><br></span></div><div><span style="line-height:1.5">~Elazar</span></div></div></div>
<br></blockquote></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br></blockquote></div></div><div class="gmail_extra"><br><br clear="all"><br>-- <br><div data-smartmail="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div></blockquote></div></div></div></div></div></div>