如何正确导入同时在主代码和模块中使用的模块?

2024-05-16 13:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个主脚本,主.py,它导入另一个带有import coolfunctions和另一个:import chores的python文件

现在,假设coolfunctions也使用杂务中的东西,因此我在coolfunctions中声明import chores。在

因为两者主.py,和coolfunctions导入杂务~这是多余的吗?还有别的办法吗?我做得对吗?在

我对python项目应该如何组织感到困惑。我有一个“配置文件“文件,我为一堆变量导入的文件~这是模块还是不是模块?我也在多个地方加载这个conf文件。在


Tags: 模块文件项目pyimport脚本声明conf
3条回答

不,这不是多余的-在主模块和coolfunctions中都可以使用import chores。在

Python的精确导入机制是复杂的(例如,模块导入只完成一次,这意味着在您的案例中,chores模块的实际解析和加载只会发生一次,这是一个很好的优化),但一般来说,您不必担心它,因为它只会工作。在

每个Python文件都是一个模块,因此您的conf.py也是一个模块。在

每个模块X应导入所有(且仅)模块Y、Z、T、。。。它需要谁的功能,不用担心其他模块的费用,Fie,Foo。。。(如有的话)可能已经完成部分或全部进口,或将来可能会这样做。在

它会使一个模块极其脆弱(事实上,它与模块性恰恰相反)如果每个模块都要担心这种微妙的“隐蔽通道”效应。在

任何人都不应该选择X来测试模块的细节,除了Z之外,其他人都不应该关注其他模块的实现

为了确保情况确实如此,为了确保这种最好的去耦策略能够并且将完全遵循合理的代码,Python在模块被导入时“缓存”:一个模块在每次运行一个程序时只“加载”一次,当任何人第一次导入它(或从它内部导入任何东西)时,所有其他导入都使用第一次加载所获得的相同对象,Python将其保存在缓存中(指定为dictsys.modules),但您只需要了解一些高级编程技术的细节。。。别担心,98.7%的时候——只要记住“进口便宜”!-). 在

当然,您通过import conf从其他几个模块中使用的conf.py绝对是一个模块(您可能认为您正在多次加载它,但除非您确实使用了非常先进和深思熟虑的技术),为什么不应该这样呢?在

如果两个模块想要使用chores,那么每个模块都必须import chores(或某种等效的导入)。每个导入只在执行导入的模块的命名空间中创建一个名称绑定;也就是说,^{}的名称空间效果对于模块的名称空间来说是本地的。在

这很好,因为通过查看模块的代码,您可以(除非是病态的情况)通过显式地将模块或模块属性绑定到名称的import语句,知道每个名称绑定到了哪里。在其他模块中进行的导入不会影响此模块的命名空间。在

相关问题 更多 >