Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么reqular包中的路径[0]是搜索的唯一索引?_Python_Python 2.7 - Fatal编程技术网

Python 为什么reqular包中的路径[0]是搜索的唯一索引?

Python 为什么reqular包中的路径[0]是搜索的唯一索引?,python,python-2.7,Python,Python 2.7,当我用Python创建一个常规包时,我会得到一个带有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法的对象,根据Python文档,它被认为是一种特殊类型的模块。我的问题是为什么在pack.\uuu路径\uuu列表中只搜索第一个项目,而忽略其他项目,以及为什么它是一个列表而不是一个普通字符串,因为其他项目没有被扫描 例如: 假设我们有一个目录名C:\code,其中包含一个包名pkg。以及另一个包含spam.py的路径: C\ pkg\

当我用Python创建一个常规包时,我会得到一个带有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法的对象,根据Python文档,它被认为是一种特殊类型的模块。我的问题是为什么在
pack.\uuu路径\uuu
列表中只搜索第一个项目,而忽略其他项目,以及为什么它是一个列表而不是一个普通字符串,因为其他项目没有被扫描

例如: 假设我们有一个目录名C:\code,其中包含一个包名pkg。以及另一个包含spam.py的路径:

    C\
     pkg\                #Regular package
         .__init__.py
     another\ 
         spam.py  #print('spam')          

所以我想知道为什么Python只遍历
\uuuu路径\uuuu[0]
,而不是像在3.X中那样遍历命名空间包的整个列表?如果未完全遍历,则将
\uuu路径\uu
作为列表是没有意义的。我知道常规包不同于命名空间包,但为什么要在这里列出一个列表,并且只允许单个搜索路径呢!但是,Python3.3遍历整个列表,在某些形式下,它通过在常规包的
\uuuuu path\uuuu
属性中添加目录来模拟命名空间包的行为

\uuuu路径\uuuu[0]
不是Python在包中搜索相对导入的唯一路径。至少这是我在CPython2.7和Python3.3中测试的真实行为。当使用相对导入时,Python从左到右遍历
\uuuuu路径\uuuu[0]
\uuuu path\uuu[0]
列表所起的作用与
sys.path
的作用相同。它们都包含系统路径(目录前缀),这些路径指向Python在使用任何导入语句(例如,
import
from
)时自动收集的包或模块

实际上,您可以使用
pkgutil.extend\u path
函数扩展
\uuu path\uuu[0]
,以允许相对包从包目录以外的其他目录导入。例如:

C:
  \dir0        #container directory
     \pkg      #package 
       __init__.py 
       spam.py
    \dir1 
        ham.py
>>> __path__ 
   ['C:\\dir0'] 
假设
\uuuu init\uuuuu.py
文件(初始化文件)包含以下代码段:

__path__.append(r'C:\\dir1')    #Or pkgutil.extend_path function
from . import spam,ham          #Relative import(relative to pkg dir)  
垃圾邮件
将从程序包目录导入,因为这在2.X和3.X中都是相对导入。但是,请注意如何成功导入
ham
,即使它不像
spam
模块那样位于包的主目录中,它仍然可以作为包
pkg
路径列表中模块
ham
的目录导入

由于
ham
是在没有任何错误的情况下自动导入的,这表明Python从左到右遍历包的
\uuuuuu路径
列表


尽管如此,您可以将
\uuuuuuuuuuuuuuuuuuu
视为
sys.path
,但
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>仅用于包内的导入。Python2.X在
sys.path
之前搜索
。这是相对的,然后是绝对的。Python3.X将其更改为仅限绝对值,除非在
from
import语句中使用点,
from。导入…
,Python 3.X将始终搜索模块搜索路径

我无法在Python2.6和2.7中重现这种行为;在Python2.6.9和2.7.9上搜索
\uuuuuuu path\uuuuuu
的所有元素。@AnttiHaapala,你是对的,我已经为这个问题写了答案。
__path__.append(r'C:\\dir1')    #Or pkgutil.extend_path function
from . import spam,ham          #Relative import(relative to pkg dir)