模块名与引入的包名相同的问题

2016-05-22 00:13:49 +08:00
 bicoff9527
我要写一个模块叫 string, 也就是 string.py
并且要在这个文件里 import 标准库中的 string

好像用 from __future__ import absolute_import 也没用?
这个好像是从同一个包下, 区别引用标准库模块还是引用其它文件, 比如从 foo 中引用 string, 这样才可以区分

不改名的情况下怎么解决?从 sys.path 里删掉当前路径?感觉不是很 pythonic
这个方法试过了是可行的
但是有没有更好的?
4422 次点击
所在节点    Python
13 条回复
majik
2016-05-22 00:54:45 +08:00
把 string 弄成文件夹 在 __init__.py 里面写你的模块,这这里面可以 import string 。还有切记别把 string 这个模块放到你的项目根路径之下,我一般会把它放进 utils 模块里面。最后说一句,使用相同的名字去封装一个模块这做法是在不可苟同。
somebody
2016-05-22 07:35:09 +08:00
import string as origstring
yangtukun1412
2016-05-22 09:24:01 +08:00
relative import
bicoff9527
2016-05-22 09:38:02 +08:00
@majik 这种做法确实不好, 但是命名时确实很容易和标准库, 特别是安装的第三方库, 出现这种情况
yangtukun1412
2016-05-22 09:40:55 +08:00
刚没看清楚问题,如果想从 string.py 中 import 标准库中的 string 库的话, 正常使用了 absolute import 的话应该是没问题的,出现你这种情况应该是因为你在同一目录下运行的程序,而 python 默认会把 cwd 加入到 sys.path 中的第一项。

解决方法可以使用 pkgutil, 其中提供了根据指定的 path 来 import module 的方法.
pimin
2016-05-22 09:43:56 +08:00
majik
2016-05-22 11:22:16 +08:00
@bicoff9527 颗粒度都掌不好的库还是不要用了。。。 AHHH
bicoff9527
2016-05-22 11:30:46 +08:00
@majik 和颗粒度有什么关系, 命名冲突本来就很常见
ayaseangle
2016-05-22 11:45:15 +08:00
不作死就不会死。当前目录在 path 最前面。
mornlight
2016-05-22 11:51:05 +08:00
不考虑把自己的模块换个名字吗,就算当前解决了问题将来也可能会让别人踩到坑。
xiaket
2016-05-22 16:04:48 +08:00
@bicoff9527 哪有那么容易重复?实在不行你往模块名前加一个公司 /组织名要够了啊?
4everLoveU
2016-05-23 11:32:48 +08:00
有非得命令成 string.py 的难言之隐吗?
julyclyde
2016-05-23 11:55:53 +08:00
要是两个外部库相互冲突倒可以理解
和标准库冲突,那一定是外部库的全责啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280344

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX