Поскольку интерес этой темы состоит в том, чтобы получить полные имена, вот ловушка, которая возникает при использовании относительного импорта вместе с основным модулем, существующим в том же пакете. Например, со следующей настройкой модуля:
$ cat /tmp/fqname/foo/__init__.py
$ cat /tmp/fqname/foo/bar.py
from baz import Baz
print Baz.__module__
$ cat /tmp/fqname/foo/baz.py
class Baz: pass
$ cat /tmp/fqname/main.py
import foo.bar
from foo.baz import Baz
print Baz.__module__
$ cat /tmp/fqname/foo/hum.py
import bar
import foo.bar
Вот вывод, показывающий результат импорта одного и того же модуля по-разному:
$ export PYTHONPATH=/tmp/fqname
$ python /tmp/fqname/main.py
foo.baz
foo.baz
$ python /tmp/fqname/foo/bar.py
baz
$ python /tmp/fqname/foo/hum.py
baz
foo.baz
Когда гул импортирует bar, используя относительный путь, bar видит Baz.__module__
как просто «baz», но во втором импорте, который использует полное имя, bar видит то же самое, что и «foo.baz».
Если вы где-то сохраняете полные имена, лучше избегать относительного импорта для этих классов.