Python中保留的模块/包名称有哪些?

6
我是一名有用的助手,可以为您翻译文本。
我在使用Python unittest时遇到了一个奇怪的错误。我的项目中有两个文件夹:
project
    code
        __init__.py        (empty)
        app.py             (defines my App class)
    test
        test.py            (contains my unit tests)

test.py是:

import os, sys, unittest
sys.path.insert(1, os.path.join(sys.path[0],'..'))
from code.app import App

class test_func1(unittest.TestCase):
    ...

当我运行test.py时,我收到以下消息:

Traceback (most recent call last):
    File "<frozen importlib._bootstrap>", line 2218, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "...test.py, line 5, in <module>
    from code.app import App
ImportError: No module named 'code.app': 'code' is not a package

在确认了__init__.py文件的存在并且苦思冥想了一段时间后,我突发奇想将应用程序目录的名称从code改为prog

import os, sys, unittest
sys.path.insert(1, os.path.join(sys.path[0],'..'))
from prog.app import App

...然后一切都好了。Unittest成功导入我的应用程序并运行了测试。

我在https://docs.python.org/3.5/reference/lexical_analysis.html#keywordshttps://docs.python.org/3/reference/import.html#path-entry-finders中搜索过,没有发现code是非法的目录名称。这个会在哪里有记录,并且还有哪些目录名称是保留的?

系统:python 3.4.3 [MSC v1600 32 bit] on win32, Windows 7


3
code并不是Python中的保留名称,但标准库中有一个名为code现有模块,因此给你的模块命名为code是一个糟糕的想法,就像将列表命名为list一样。根据您提供的信息,我预计您的模块会与内置模块产生命名冲突,但实际情况可能有多种可能性。 - user2357112
请纠正我,但是根据您在__init__.py中定义的内容,您应该执行from code import app。如果app__init__.py中定义,则可以尝试执行from code.app ...,如果是这样,请忽略我的评论。 - Torxed
https://dev59.com/2Wct5IYBdhLWcg3wUb5- - chepner
@Torxed,更明确的做法是使用from prog import app,然后在脚本中使用限定的app.App。这不需要在__init__.py中添加任何内容,但仅在您想要导入和使用两个都定义了App的不同模块时才需要。 - Dave
注意,我之所以遇到这个问题,是因为我在使用用户自定义异常时遇到了问题,并需要想出一个小例子来发布到 SO 上。该包括异常的小例子可以正常运行(只要它具有不冲突的包名称),因此现在又回到了主要问题。 - Dave
1个回答

5

code 不是保留关键字,但它已经在标准库中定义好了,这是一个普通的模块而不是包。如果要从您的包中进行导入,应该使用相对导入。

from .code.app import App

1
根据 PEP-0404 的规定,你的做法应该是正确的。但当我尝试使用 from .code.app import App 时,却出现了“SystemError: Parent module ' ' not loaded, cannot perform relative import”的错误提示。唯一有效的方法是使用那个被认为不再合法的 from prog.app import App(没有前导点)。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接