来自包导入模块的python,这有啥问题吗?
Posted
技术标签:
【中文标题】来自包导入模块的python,这有啥问题吗?【英文标题】:python from package import module, any problem with this?来自包导入模块的python,这有什么问题吗? 【发布时间】:2021-11-20 10:23:30 【问题描述】:在我的 python 代码中,我使用了“from packageA import moduleA”。我的主管评论说这是非常危险的。他说正确的做法是“import packageA.moduleA as moduleA”。
有没有cmets?这真的很危险吗?还是更像是一种常见的做法?
【问题讨论】:
你的主管很迷信。from packageA.moduleA import *
有时会出现问题,导致不同平台的命名规则不同。所以Python只会执行packageA和moduleA目录下的__init__.py
文件。但是,import packageA.moduleA
就可以了,导入packageA.moduleA
下的所有模块
【参考方案1】:
我认为import
的使用取决于项目,因为在某些情况下您可以从模块/包中导入。
来自 python 文档:
包: 可以包含子模块或递归子包的 Python 模块。从技术上讲,包是具有 path 属性的 Python 模块。
模块: 作为 Python 代码的组织单元的对象。模块有一个包含任意 Python 对象的命名空间。模块通过导入过程加载到 Python 中。
https://docs.python.org/3/reference/import.html
所以我是这样看的:
当您从模块(例如 from math import pi
)导入变量时,您的导入 from packageA import moduleA
更合适。
我怀疑您正在尝试从包中导入(考虑到包包含子模块,您需要正确调用它们以获取子模块的正确路径并在需要的地方调用)。
例如,假设您的包名称为 World
,其中包含此层次结构中的以下文件(子模块)Europe\Spain
,导入将是 from World.Europe import Spain
【讨论】:
【参考方案2】:我并不是真正在这个行业工作,把编程作为一种爱好,所以我没有资格谈论专业性,但我个人认为from A import B
绝对没有问题,除了它可能会创造一个事实在您的代码中引用 B
时有点混乱,例如:
from math import pi
print(pi)
对比:
import math
print(math.pi)
第二个版本更容易理解pi
的来源。这也很有用,因为在您要导入的多个库中可能存在同名的函数/方法。一个这样的例子是 Python 中的 html
和 glob
库中的 escape()
函数。
from html import escape
from glob import escape
print(help(escape))
上面的代码将打印出glob
库的escape()
函数,因为它是最近从那里导入的。
import html
import glob
print(help(html.escape))
print(help(glob.escape))
上面的代码区分了你使用的是哪一个。
这也可以:
from html import escape as h_escape
from glob import escape as g_escape
print(help(h_escape))
print(help(g_escape))
上面的代码也区分了这两件事。但是,我又不是行业专家,所以我对它的需求一无所知;但就我个人而言,我自己认为没有任何问题。
附:我从这里得到了所有这些:5 Common Python Mistakes and How to Fix Them - Corey Schafer
【讨论】:
以上是关于来自包导入模块的python,这有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章