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 包?
并非项目中的每个子目录都必须是一个包。例如docs
和tests
通常只是目录。
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 包”的区别的主要内容,如果未能解决你的问题,请参考以下文章