I really like this idea, and in the rare case that someone adds an element 
to a class with the same name as the class that would shadow your 
definition, but that seems fine to me.
 
On Thursday, September 22, 2016 at 11:09:28 PM UTC-4, Nick Coghlan wrote:
>
> On 23 September 2016 at 12:05, אלעזר <ela...@gmail.com <javascript:>> 
> wrote:
> > On Fri, Sep 23, 2016 at 4:17 AM Nick Coghlan <ncog...@gmail.com 
> <javascript:>> wrote:
> > ...
> >>
> >> As others have noted, the general idea of allowing either a
> >> placeholder name or the class name to refer to a suitable type
> >> annotation is fine, though - that would be a matter of implicitly
> >> injecting that name into the class namespace after calling
> >> __prepare__, and ensuring the compiler is aware of that behaviour,
> >> just as we inject __class__ as a nonlocal reference into method bodies
> >> that reference "super" or "__class__".
> >>
> > Just to be sure I understand, will the following work?
> >
> > class A:
> >     def repeat(n: int) -> List[A]: pass
>
> Right now? No - you'll get a name error on the "A", just as you would
> if you tried to reference it as a default argument:
>
>   >>> class A:
>   ...     def side_effects_ahead(arg: print(A) = print(A)) -> print(A): 
> pass
>   ...
>   Traceback (most recent call last):
>     File "<stdin>", line 1, in <module>
>     File "<stdin>", line 2, in A
>   NameError: name 'A' is not defined
>
> And that's the problem with using the class name in method annotations
> in the class body: they're evaluated eagerly, so they'd fail at
> runtime, even if the typecheckers were updated to understand them.
>
> Rather than switching annotations to being evaluated lazilly in the
> general case, one of the solutions being suggested is that *by
> default*, the class name could implicitly be bound in the body of the
> class definition to some useful placeholder, which can already be done
> explicitly today:
>
>   >>> class A:
>   ...     A = "placeholder"
>   ...     def side_effects_ahead(arg: print(A) = print(A)) -> print(A): 
> pass
>   ...
>   placeholder
>   placeholder
>   placeholder
>
> Since method bodies don't see class level name bindings (by design),
> such an approach would have the effect of "A" referring to the
> placeholder in the class body (including for annotations and default
> arguments), but to the class itself in method bodies.
>
> I don't think this is an urgent problem (since the "A"-as-a-string
> spelling works today without any runtime changes), but it's worth
> keeping an eye on as folks gain more experience with annotations and
> the factors affecting their readability.
>
> Cheers,
> Nick.
>
> -- 
> Nick Coghlan   |   ncog...@gmail.com <javascript:>   |   Brisbane, 
> Australia
> _______________________________________________
> Python-ideas mailing list
> python...@python.org <javascript:>
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to