<div dir="ltr"><div dir="ltr"><div dir="ltr">On Mon, Apr 15, 2019 at 8:12 PM Nathaniel Smith <<a href="mailto:njs@pobox.com">njs@pobox.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Mon, Apr 15, 2019 at 5:00 PM Michael Sullivan <<a href="mailto:sully@msully.net" target="_blank">sully@msully.net</a>> wrote:<br>
><br>
> I've submitted PEP 591 (Adding a final qualifier to typing) for discussion to typing-sig [1].<br>
<br>
I'm not on typing-sig [1] so I'm replying here.<br>
<br>
> Here's the abstract:<br>
> This PEP proposes a "final" qualifier to be added to the ``typing``<br>
> module---in the form of a ``final`` decorator and a ``Final`` type<br>
> annotation---to serve three related purposes:<br>
><br>
> * Declaring that a method should not be overridden<br>
> * Declaring that a class should not be subclassed<br>
> * Declaring that a variable or attribute should not be reassigned<br>
<br>
I've been meaning to start blocking subclassing at runtime (e.g. like<br>
[2]), so being able to express that to the typechecker seems like a<br>
nice addition. I'm assuming though that the '@final' decorator doesn't<br>
have any runtime effect, so I'd have to say it twice?<br>
<br>
@typing.final<br>
class MyClass(metaclass=othermod.Final):<br>
    ...<br>
<br>
Or on 3.6+ with __init_subclass__, it's easy to define a @final<br>
decorator that works at runtime, but I guess this would have to be a<br>
different decorator?<br>
<br>
@typing.final<br>
@alsoruntime.final<br>
class MyClass:<br>
    ...<br>
<br>
This seems kinda awkward. Have you considered giving it a runtime<br>
effect, or providing some way for users to combine these two things<br>
together on their own?<br>
<br></blockquote><div>Nothing else in typing does any type of runtime enforcement, so I'd be reluctant to start here.<br></div><div><br></div><div>One approach would be doing something like this (maybe in a support module):</div><div>if typing.TYPE_CHECKING:<br>    from typing import final<br>else:<br></div><div>    from alsoruntime import final</div><div><br></div><div>So that at checking time, the typechecker would use the typing final but at runtime we'd get something that does enforcement.</div><div>(And for the pre-3.6 case, you could maybe use something like six.add_metaclass in order to specify the metaclass as a decorator.)</div><div><br></div><div>I can add this as an example to the PEP.<br></div><div><br></div><div>-sully<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
-n<br>
<br>
[1] <a href="https://github.com/willingc/pep-communication/issues/1" rel="noreferrer" target="_blank">https://github.com/willingc/pep-communication/issues/1</a><br>
[2] <a href="https://stackoverflow.com/a/3949004/1925449" rel="noreferrer" target="_blank">https://stackoverflow.com/a/3949004/1925449</a><br>
<br>
-- <br>
Nathaniel J. Smith -- <a href="https://vorpus.org" rel="noreferrer" target="_blank">https://vorpus.org</a><br>
</blockquote></div></div></div>