当前位置: 首页 > 知识库问答 >
问题:

什么是Python隐式相对导入

解翰采
2023-03-14

在PEP 8中--Python代码风格指南

明确的相对进口是绝对进口的一种可接受的替代方案

有人能详细解释一下吗?

python2 -c 'import csv; print(csv)'
<module 'csv' from '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.pyc'>

$ touch csv.py

$ python2 -c 'import csv; print(csv)'
<module 'csv' from 'csv.pyc'>

# In python3 still search from current package
$ python3 -c 'import csv; print(csv)'
<module 'csv' from '/path_to/csv.py'>

共有1个答案

廖夜洛
2023-03-14

当你说:

import foo

Python2将首先查看调用者的目录。Python3不会这样做,它只会在通常的位置找到foo,比如sys.path(pythonpathsite-packages等)。

这意味着如果您正在编写一个支持Python3的包,您应该在包中这样说:

import mypkg.foo

或使用显式相对导入:

from . import foo
 类似资料:
  • 问题内容: 假设我有以下文件, 现在,如果我跑步,它说。 这是有道理的,并且按照此链接中的以下语句运行: “它将首先在包的目录中查找” 假设我稍微修改了文件结构(添加了一个核心目录): 现在,如果我运行,它将加载内置模块。 同样在第二种情况下,如果必须遵守“ 它将首先在软件包的目录中查找 ” 这样 的语句 ,是否 应该加载本地文件,因为它是“软件包的目录”? 我的术语“包目录”的意义是 明确 的

  • 本文向大家介绍JSP中的out隐式对象是什么?,包括了JSP中的out隐式对象是什么?的使用技巧和注意事项,需要的朋友参考一下 out隐式对象是javax.servlet.jsp.JspWriter对象的实例,用于在响应中发送内容。 初始JspWriter对象的实例化取决于页面是否被缓冲。使用page指令的buffered ='false'属性可以很容易地关闭缓冲。 JspWriter对象包含与j

  • 问题内容: 我想知道在Python应用程序中导入包的首选方法。我有一个这样的包结构: project.app1.views进口project.app1.models和project.app2.models。我想到有两种方法可以做到这一点。 绝对进口: 或具有明确的相对导入,如在Python 2.5中使用PEP 328引入的那样: 什么是最pythonic的方式做到这一点? 问题答案: 绝对进口。从

  • 我正在阅读本教程,它的底部写道: 由于如果不加选择地使用隐式转换,隐式转换可能会产生陷阱,因此编译器会在编译隐式转换定义时发出警告。要关闭警告,请执行以下任一操作:将 scala.language.implicitConversions 导入到隐式转换定义的作用域中... 如果使用隐式 val 而不是隐式 def,则不会引发警告。为什么? 换句话说,如果我执行以下操作,我不需要导入: 但是,如果我

  • 问题内容: 大家好-我正在用Python中的相关知识来表达自己的观点。我已经阅读了30篇文档,并在SO和其他论坛上阅读了很多帖子-似乎还是行不通。 我的目录结构目前看起来像这样 我希望expander.py和language_id.py可以访问功能模块。我运行python main.py,可以从components.expander import 和components.language_id i

  • 问题内容: 据我了解,python模块永远不会导入两次,即该模块中的代码仅在首次导入时才执行。随后的import语句只需将模块添加到导入范围即可。 我有一个名为“ TiledConvC3D.py”的模块,但似乎已多次导入。我使用pdb在该模块的代码顶部打印堆栈。 这是从第一次执行模块开始的堆栈跟踪的结尾: 它将继续执行多次。但是,第二次调用的完整堆栈跟踪不会显示对的任何调用,因此不应执行这些执行: