来自包导入模块的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 中的 htmlglob 库中的 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,这有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python导入模块问题

一些模塊的用法

导入整个模块与仅从 python 中的模块导入所需的方法有啥区别? [复制]

Python基础(二十六):模块和包简单介绍

导入模块 和 包

python可以“从包导入module.symbol_name”吗?