New submission from Martijn Pieters:
Forward references to a module can fail, if the module doesn't yet have the
required object. The "forward references" section names circular dependencies
as one use for forward references, but the following example fails:
$ cat test/__init__.py
from .a import A
from .b import B
$ cat test/a.py
import typing
from . import b
class A:
def foo(self: 'A', bar: typing.Union['b.B', None]):
pass
$ cat test/b.py
import typing
from . import a
class B:
def spam(self: 'B', eggs: typing.Union['a.A', None]):
pass
$ bin/python -c 'import test'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/mjpieters/Development/venvs/stackoverflow-3.5/test/__init__.py",
line 1, in <module>
from .a import A
File "/Users/mjpieters/Development/venvs/stackoverflow-3.5/test/a.py", line
2, in <module>
from . import b
File "/Users/mjpieters/Development/venvs/stackoverflow-3.5/test/b.py", line
4, in <module>
class B:
File "/Users/mjpieters/Development/venvs/stackoverflow-3.5/test/b.py", line
5, in B
def spam(self: 'B', eggs: typing.Union['a.A', None]):
File
"/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/typing.py",
line 537, in __getitem__
dict(self.__dict__), parameters, _root=True)
File
"/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/typing.py",
line 494, in __new__
for t2 in all_params - {t1} if not isinstance(t2, TypeVar)):
File
"/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/typing.py",
line 494, in <genexpr>
for t2 in all_params - {t1} if not isinstance(t2, TypeVar)):
File
"/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/typing.py",
line 185, in __subclasscheck__
self._eval_type(globalns, localns)
File
"/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python3.5/typing.py",
line 172, in _eval_type
eval(self.__forward_code__, globalns, localns),
File "<string>", line 1, in <module>
AttributeError: module 'test.a' has no attribute 'A'
The forward reference test fails because only NameError exceptions are caught,
not AttributeError exceptions.
----------
components: Library (Lib)
messages: 261172
nosy: mjpieters
priority: normal
severity: normal
status: open
title: typing forward references and module attributes
versions: Python 3.5, Python 3.6
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue26477>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com