Python 在uuu init_uuuuuuuuuu.py和`import as`语句中导入
我遇到了一个问题,在Python 在uuu init_uuuuuuuuuu.py和`import as`语句中导入,python,python-3.x,Python,Python 3.x,我遇到了一个问题,在\uuu init\uuuu.py中有导入,并且在包的模块中使用导入为 我的项目有一个子包,在它的\uuuu init\uuuuuu.py中,我使用从导入为语句将一个类从模块“提升”到子包级别。模块使用绝对导入从该子包导入其他模块。我得到这个错误AttributeError:“module”对象没有属性“subpkg” 例子 结构: pkg/ ├── __init__.py ├── subpkg │ ├── __init__.py │ ├── one.py │ └
\uuu init\uuuu.py
中有导入,并且在包的模块中使用导入为
我的项目有一个子包,在它的\uuuu init\uuuuuu.py
中,我使用从导入为语句将一个类从模块“提升”到子包级别。模块使用绝对导入从该子包导入其他模块。我得到这个错误AttributeError:“module”对象没有属性“subpkg”
例子
结构:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/\uuuu init\uuuu.py为空
pkg/subpkg/__;u init.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subkg/one.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subpkg/two_longname.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
包装/tst.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
输出:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
这里唯一的缺点是我不能为模块创建短别名。我从@begueradj的回答中得到了这个想法
也可以在one.py
中使用相对导入来解决问题。但我认为这只是变通办法2的一种变体
问题
有人能解释一下这里到底发生了什么吗?为什么在\uuu init\uuuu.py
中同时导入和使用导入为
会导致此类问题
有更好的解决办法吗
原样
这是我最初的例子。这不太现实,但我不会删除它,所以@begueradj的答案仍然有意义
pkg/\uuuu init\uuuu.py为空
pkg/subpkg/__;u init.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subkg/one.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subkg/two.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
包装/tst.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
输出:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
class Two:
pass
from pkg.subpkg import One
print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
from pkg.subpkg import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
from pkg.subpkg.one import One
File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
from pkg.subpkg import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
from pkg.subpkg.one import ONE
File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
在这种情况下,我在导入时出错(就像在我的原始项目中一样,它也使用导入为。关于调用模块的方式,您的项目结构必须如下所示:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two.py
tst.py
class TWO:
def functionTwo(self):
print("2")
如下定义您的two.py:
pkg/
├── __init__.py
├── subpkg
│ ├── __init__.py
│ ├── one.py
│ └── two.py
tst.py
class TWO:
def functionTwo(self):
print("2")
如下定义您的one.py:
from pkg.subpkg import two
class ONE:
def functionOne(self):
print("1")
self.T=two.TWO()
print("Calling TWO from ONE: ")
self.T.functionTwo()
像这样定义您的test.py
from pkg.subpkg import one
class TEST:
def functionTest(self):
O=one.ONE()
O.functionOne()
if __name__=='__main__':
T=TEST()
T.functionTest()
执行时,您将得到以下结果:
1
Calling TWO from ONE:
2
希望这能有所帮助。这里有一个关于发生了什么的理论
当您将用作
保留字时,例如:
import pkg.subpkg.two_longname as two
Python必须完全初始化并解决与pkg.subpkg
有关的所有依赖关系。但是有一个问题,要完全加载subkg
,您还需要完全加载one.py,对吗?wich同时使用as
关键字导入two_longname.py
。。。你能看到这里的递归吗?这就是为什么在做这件事的时候:
import pkg.subpkg.two_longname as two
您会收到一个错误,声称subpkg
不存在
要执行测试,请转到one.py并将其更改为:
#import pkg.subpkg.two_longname as two
from pkg.subpkg import two_longname
#class One(two.Two):
class One(two_longname.Two):
pass
我想这都是关于性能的,只要有可能,Python就会部分加载模块。而as
关键字是例外情况之一。我不知道是否还有其他人,但了解他们会很有趣。您错误地认为一个人不能有来自的别名。。。从…导入
,作为。。。导入。。。自Python 2.0以来,as一直存在。导入。。。as
是一种晦涩难懂的语法,不是很多人都知道,但您在代码中意外地使用了它
声称以下2项“实际上”相同:
将foo.bar.bazaar导入为baz
来自foo.bar进口商场作为baz
这句话在3.6.x之前(含3.6.x)的Python版本中并不完全正确,正如您遇到的一个案例所证明的,即如果所需的模块已经存在于sys.modules
中,但尚未初始化。导入。。。as
要求模块foo.bar
作为属性bar
插入foo.bar
命名空间中,除了位于sys.modules
中之外,而来自。。。导入。。。as
在sys.modules
中查找foo.bar
(请注意,import foo.bar
仅确保模块foo.bar
位于sys.modules
中,并且可以作为foo.bar
访问,但可能尚未完全初始化。)
按以下方式更改代码为我带来了好处:
# import pkg.subpkg.two_longname as two
from pkg.subpkg import two_longname as two
代码在Python2和Python3上都能完美运行
此外,出于同样的原因,在one.py
中,您不能从pkg import subkg执行
要进一步演示此错误,请如上所述修复one.py
,并在tst.py
中添加以下代码:
from pkg.subpkg import two_longname
class One(two_longname.Two):
pass
import pkg
import pkg.subpkg.two_longname as two
del pkg.subpkg
from pkg.subpkg import two_longname as two
import pkg.subpkg.two_longname as two
只有最后一行崩溃,因为来自。。。import
为pkg.subpkg
查询sys.modules
,并在那里找到它,而import。。。as
为pkg
查阅sys.modules
,并尝试在pkg
模块中作为属性查找subpkg
。由于我们刚刚删除了该属性,最后一行失败,出现了AttributeError:“module”对象没有属性“subpkg”
由于import foo.bar As baz
语法有点晦涩,并且添加了更多的角格,而且我很少看到它被使用,因此我建议完全避免使用它,并从中选择。。导入。。。正如公认的答案所说,这是Python行为的一个问题
我提出了一个错误:
Serhiy Storchaka的修复是在Python 3.7中合并的,我的理解是,将导入内容的使用转移到函数中会有所帮助,因为它允许Python先导入所有内容,然后开始使用它。然而,这并不总是可能做到的。例如,导入一个超类。也许我应该将我的示例建立在这个案例的基础上,使其更加真实。另外,我注意到您使用了from pkg.subpkg import two
而不是将pkg.subpkg.two导入为two
。这