已经使用平面包,我不期待我遇到的问题,我遇到嵌套包。这是…
目录布局
dir
|
+-- test.py
|
+-- package
|
+-- __init__.py
|
+-- subpackage
|
+-- __init__.py
|
+-- module.py
init.py的内容
package / __ init__.py和package / subpackage / __ init__.py都是空的。
module.py的内容
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
test.py的内容(3版本)
版本1
# file test.py
from package.subpackage.module import *
print attribute1 # OK
这是不好的和不安全的方式导入的东西(全部导入大量),但它的工作原理。
版本2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1
一种更安全的方式导入,逐项,但它失败,Python不想要:失败与消息:“没有模块命名模块”。但是…
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here
…说“< module'package.subpackage.module'from'...'> ;.所以这是一个模块,但这不是一个模块/ -P 😯 ...呃 版本3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK
这一个工作。所以你被迫使用overkill前缀所有的时间或使用不安全的方式在版本#1和不允许由Python使用安全的方便的方式?更好的方式,这是安全的,避免不必要的长前缀是唯一一个Python拒绝?这是因为它喜欢导入*或因为它喜欢超长的前缀(这不有助于强制这种做法)?
对不起,硬的话,但这是两天,我试图解决这个愚蠢的行为。除非我在某个地方完全错了,这会让我感到在Python的包和子包的模型中真的坏了。
笔记
>我不想依赖sys.path,避免全局副作用,也不想使用* .pth文件,这只是另一种使用sys.path与全局效果相同的方式。对于要清洁的解决方案,它只能是本地的。 Python能够处理子包,它不是,但它不应该要求使用全局配置来处理本地东西。
>我也试过在package / subpackage / __ init__.py中使用import,但它没有解决,它做同样的,并抱怨subpackage不是一个已知的模块,而打印subpackage说它是一个模块(奇怪的行为,再次)。
可能我是完全错误的(我喜欢的选择),但这让我感到很失望的Python。
任何其他已知的方式旁边的三个我试过?我不知道的东西?
(叹)
—–% —–编辑—–>%—–
结论到目前为止(经过人们的评论)
在Python中没有什么像真正的子包,因为所有包引用都是一个全局的字典,这意味着没有本地字典,这意味着没有办法来管理本地包引用。
您必须使用完全前缀或短前缀或别名。如:
完全前缀版本
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
短前缀版本(但重复前缀)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place
或者,上述的变化。
from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
分解版本
如果您不介意一次导入多个实体,您可以:
from package.subpackage.module import attribute1, attribute2
# and etc.
不是在我最喜欢的味道(我喜欢每个进口实体有一个import语句,但可能是我个人会喜欢的。
更新(2012-09-14):
最后似乎在实践中,除了有关于布局的评论。代替上面,我使用:
from package.subpackage.module import (
attribute1,
attribute2,
attribute3,
...) # and etc.