<div dir="ltr">I like this proposal; given Python's flat nominal type hierarchy, it will be useful to have a parallel subtyping mechanism to give things finer granularity without having to resort to ABCs.<div><br></div><div>Are the return types of methods invariant or variant under this proposal?</div><div><br></div><div>I.e. if I have</div><div><br></div><div><font face="courier new, monospace">Â class A(Protocol):</font></div><div><font face="courier new, monospace">Â Â def f() -> int: ...</font></div><div><br></div><div>does</div><div><br></div><div><font face="courier new, monospace">Â class B:</font></div><div><font face="courier new, monospace">Â Â def f() -> bool:</font></div><div><font face="courier new, monospace">Â Â Â return True</font></div><div><br></div><div>implicitly implement the protocol?</div><div><br></div><div><div>Also, marking Protocols using subclassing seems confusing and error-prone.</div><div>In your examples above, one would think that you could define a new protocol using</div><div><br></div><div><font face="courier new, monospace">class SizedAndClosable(Sized):</font></div><div><font face="courier new, monospace">Â Â pass</font></div><div><br></div><div>instead of</div><div><br></div><div><div><font face="courier new, monospace">class SizedAndClosable(Sized, Protocol):</font></div><div><font face="courier new, monospace">Â Â pass</font></div></div><div><font face="courier new, monospace"><br></font></div><div>because Sized is already a protocol.</div><div><br></div><div>Maybe the below would be a more intuitive syntax:</div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Â @protocol</font></div><div><font face="courier new, monospace">Â class SizedAndClosable(Sized):</font></div><div><font face="courier new, monospace">Â Â Â pass</font></div><div><br></div></div><div>Furthermore, I strongly agree with #7. Typed, but optional, attributes are a bad idea.</div><div><blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr"><div>
</div></div>
</blockquote></div></div>