python导入子包中的模块_Python:导入子包或子模块

已经使用平面包,我不期待我遇到的问题,我遇到嵌套包。这是…

目录布局

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'...'&gt ;.所以这是一个模块,但这不是一个模块/ -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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值