On Fri, Jun 2, 2017 at 8:57 PM, Guido van Rossum <gu...@python.org> wrote: > On Fri, Jun 2, 2017 at 9:41 AM, Koos Zevenhoven <k7ho...@gmail.com> wrote: >> >> I still don't understand what would happen with __annotations__. If >> the decorator returns a non-function, one would expect the annotations >> to be in the __annotations__ attribute of the enclosing class or >> module. If it returns a function, they would be in the __annotations__ >> attribute of the function. And I'm talking about the runtime behavior >> in Python as explained in PEP484 and PEP526. I would expect these >> declarations to behave according to the same principles as other ways >> to annotate variables/functions. If there is no runtime behavior, a >> comment-based syntax might be more appropriate. Or have I missed >> something? > > > So when returning a function, the runtime version of the decorator can > easily update the function's __annotations__. But when returning a > non-function, the decorator would have a hard time updating __annotations__ > of the containing class/module without "cheating" (e.g. sys._getframe()). I > think the latter is similar to e.g. attributes defined with @property -- > those don't end up in __annotations__ either. I think this is an acceptable > deficiency. >
I suppose it is, especially because there seems to be nothing that prevents you from getting runtime annotations in the enclosing class/module : number: int @call def number(): return 42 But for functions one could have ( using the context manager example): def session(url: str) -> ContextManager[DatabaseSession]: ... @predeclared @contextmanager def session(url: str) -> Iterator[DatabaseSession]: s = DatabaseSession(url) try: yield s finally: s.close() This makes it clear that the function is declared elsewhere. But the `predeclared` decorator would need tricks like sys._getframe(1) to set session.__annotations__ according to the predeclaration. -- Koos -- + Koos Zevenhoven + http://twitter.com/k7hoven +
_______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com