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

......说。这是一个模块,但那不是模块/ -P 8-O ......呃

版本3

# file test.py v3

from package.subpackage.module import attribute1

print attribute1 # OK

这个有效。所以你要么被迫一直使用overkill前缀,要么使用版本#1中的不安全方式而Python不允许使用安全方便的方法?更好的方法是安全并避免不必要的长前缀是Python拒绝的唯一方法吗?这是因为它喜欢import *还是因为它喜欢过长的前缀(这无助于强制执行这种做法)?

很抱歉这些难以理解的话,但那是两天我试图解决这种类似愚蠢的行为。除非我在某个地方完全错了,否则这会让我觉得Python的包和子包模型确实破坏了一些东西。

笔记

我不想依赖sys.path,避免全球副作用,也不想依赖*.pth文件,这只是另一种sys.path与同样的全球效应相结合的方式。为了使解决方案清洁,它必须是本地的。要么Python能够处理子包,要么不是,但它不应该需要使用全局配置来处理本地的东西。

我也试过使用import package/subpackage/__init__.py,但它没有解决任何问题,它做同样的事情,并且抱怨subpackage不是一个已知的模块,print subpackage而是说它是一个模块(怪异的行为,再次)。

可能是我完全错了(我更喜欢的选项),但这让我对Python感到很失望。

除了三个我试过的其他任何已知的方法?我不知道的事情?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值