当前位置: 首页 > 面试题库 >

何时使用绝对导入

越琦
2023-03-14
问题内容

我正在更改一堆旧的python代码,这些代码偶尔会在程序包之间发生名称冲突。我有一个问题,什么时候应该使用绝对导入,以及仅通过名称导入同级模块是否合适。

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py

包中的每个import语句应如下所示:

import package.subX.moduleX

要么

from package.subX import moduleX

那么在子包__init__.py文件中。简单地放一下会不会错

import moduleA
import moduleB

或者,在/package/subA/moduleA.py中,简单地输入以下内容是否会出错:

import moduleB

问题答案:

尽管相对导入很长时间以来都是默认行为,但事实证明这是一个非常糟糕的主意。您可以在此站点上找到很多问题,其中有人只是用内置模块命名文件,并用奇怪的错误消息破坏了他们的应用程序

这就是为什么通过在 各处 引用您的项目(包括程序包)来进行绝对导入始终是一件好事的原因。

简而言之,请使用以下样式:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

从PEP8引用:

强烈建议不要将相对进口用于包装内进口。始终对所有导入使用绝对包路径。即使现在PEP
328
已在Python
2.5中完全实现,仍不鼓励使用其显式相对导入的样式。绝对导入更具可移植性,通常更具可读性。



 类似资料:
  • 问题内容: 在Python中使用相对导入有一个缺点,您将无法再独立运行模块,因为您将得到一个异常: 为了能够执行以下所有操作,我应该如何修改示例代码:和 我正在寻找适用于python 2.6+(包括3.x)的解决方案。 问题答案: 首先,我假设您意识到您编写的内容将导致循环导入问题,因为foo导入bar反之亦然;尝试添加 to test.py,您将看到它失败。必须更改示例才能正常工作。 因此,您要

  • 问题内容: 我似乎无法让绝对导入在python中工作。这是我的文件结构: foo.py: 我反而得到: 这到底是怎么回事?我觉得我缺少基本的东西。尽管这个例子很简单,但我需要绝对导入才能为实际项目工作,因此仅用相对导入替换导入是不可行的。我正在使用python 2.7.13 预先感谢您的任何见解! 问题答案: 由于未显示,因此我必须假设您正在运行,这会将脚本()的目录放在开始的位置,而实际上您希望

  • 我似乎无法让绝对导入在python中工作。以下是我的文件结构: 福。py: 我反而得到: 这到底是怎么回事?我觉得我错过了一些基本的东西。虽然这个例子很简单,但我需要绝对导入来为实际项目工作,因此仅用相对导入替换导入是不可取的。我正在使用python 2.7。13 这里列出的解决方案都没有帮助 提前感谢您的任何见解!

  • vscode插件开发,如何使用绝对路径导入js模块? 我尝试以绝对路径导入js模块,智能提示没有问题,但运行调试就报错,如何解决这个问题?以下是详情。 jsconfig.js配置代码如下 导入js模块代码内容,所在文件路径:src/util/TestUtil.js 以绝对路径导入,调用const TestUtil = require('@/util/TestUtil.js')代码导入,输入Test

  • 当我使用相对导入时,我的代码运行正常,但pycharm抱怨。总之。py,导入行用红色下划线,我没有完成。 如果我尝试通过在任何地方添加“app.”来切换到使用绝对导入,pycharm 很高兴,但代码不再运行。我得到:“ModuleNotFoundError:没有名为'app'的模块” 这是我的项目的树形结构。这是我的test_import文件夹的内容: main.py mul.py: sum.py

  • 问题内容: 我有一个生产和开发服务器。问题是目录结构。 发展: 生产: 我如何在两个服务器上使用一个in 文件夹来使用该属性的相同路径?我可以在相对路径中使用技巧吗? 问题答案: 该URL 相对于CSS文件的位置,因此这应该对您有用: 相对URL返回两个文件夹,然后返回该文件夹-只要结构相同,它就适用于两种情况。 从https://www.w3.org/TR/CSS1/#url 部分URL是相对于