PyCharm 中“目录”和“Python 包”的区别

Posted

技术标签:

【中文标题】PyCharm 中“目录”和“Python 包”的区别【英文标题】:Difference between 'Directory' and 'Python Package' in PyCharm 【发布时间】:2019-12-10 13:24:50 【问题描述】:

    何时使用 Directory over Python 包? PS:我知道我可以从后者导入,但不能从前者导入。如果是这样,为什么不将所有内容都创建为 Python 包? 另外,PyCharm 是否根据其名称将位置标记为一个或另一个?这种行为背后的模式是什么? 例如,我创建了一个目录并将其命名为“lambda”。但是当我将它重命名为“lambdas”时,pycharm 自动将其更改为 Python 包(带有点符号的公文包)。 Python 关键字?

【问题讨论】:

【参考方案1】:

何时使用 Directory over Python Package?

当您想在其中放置一些应该可以导入的模块时,您可以使用“Python 包”。 PyCharm 会自动为该目录创建一个__init__.py

为什么不将所有东西都创建为 Python 包?

并非项目中的每个子目录都必须是一个包。例如docstests 通常只是目录。

PyCharm 是否根据名称将位置标记为一个或另一个?

如果子目录名称为is a valid identifier and not a keyword,PyCharm 似乎会用点标记图标,无论子目录是否为包。这可能是因为在 Python 3.3+ 中,子目录也是 implicit namespace packages(即使没有 __init__.py 文件,它们仍然可以导入)。

如果您有一个与 Python 2.7 解释器关联的项目,除非添加了 __init__.py 文件,否则您不会在图标上看到点,因为隐式命名空间包在 Python 2 中不是一个东西。

【讨论】:

谢谢。澄清一下,在 Python 3.3+ 中,PyCharm 无论如何都会用一个点标记一个子目录(只要它是一个“标识符”)。这是否意味着在这种情况下每个子目录都是可导入的?如果是这样,我如何像你提到的那样为测试和文档取消标记? 是的,这意味着每个子目录都是可导入的。我不知道如何在 PyCharm 中取消标记,可能你不能。 from services.StockAnalyzer import StockReport 服务是否有 init.py 我可以通过这种方式导入,你能解释一下如果我有 init 会有什么样的限制吗文件与否我不明白区别

以上是关于PyCharm 中“目录”和“Python 包”的区别的主要内容,如果未能解决你的问题,请参考以下文章

pycharm快捷键常用设置配置管理(转载)自己看的

pycharm怎么引Python包?

Pycharm调试

python包管理——python venv和pycharm

pycharm 添加python包 举例cv2

超详细的Pycharm+Anconda安装配置教程