正确的样板是none,只需编写显式的相对导入,并在有人试图将模块作为脚本运行或
sys.path
from . import baz
pep366中给出的样板文件只是为了证明提议的更改足以让用户进行
*工作如果他们真的愿意,这并不意味着让直接执行工作是一个好主意(事实并非如此,这是一个坏主意,几乎不可避免地会导致其他问题,即使是政治公众人物的样板)。
您建议的替代样板重现了Python2中隐式相对导入引起的问题:
"baz"
模块导入为
baz
从
__main__
,但将作为
"foo.baz"
sys.modules
以不同的名字。
在其他问题中,这意味着如果其他模块抛出
foo.baz.SomeException
__主__
baz.SomeException
,它不会工作,因为这将是来自两个不同模块的两个不同的异常对象。
相比之下,如果使用PEP样板,那么
__主__
将正确导入
巴兹
作为
,您唯一需要担心的是其他可能导入的模块
foo.bar
如果您想要更简单的样板文件,明确防止“无意中以不同的名称复制同一模块的两个副本”的错误,而不必硬编码包名称,则可以使用以下方法:
if not __package__:
raise RuntimeError(f"{__file__} must be imported as a package submodule")
但是,如果你要这么做,你也可以这么做
from . import baz
如果有人尝试直接运行脚本而不是通过
-m
*
直接执行
-
除目录和zip文件路径外的文件路径参数(
python <file path>
).
-
-c
python -c <code>
-
交互式口译员(
python
).
-
标准输入(
python < <file path>
但不是来自:
-
目录或zip文件路径参数(
python <directory or zip file path>
).
-
A
论据(
python -m <module name>
).
-
进口声明(
import <module name>
-
是第一个子表达式
__name__ == "__main__"
__package__ is None
很难得到
除了
模块采用现代进口系统。但它以前更常见,因为它不是由导入系统在模块加载时设置的,
__package__
__包\uuuu不是
用于
暗示直接执行
(上面的第7种情况),所以要过滤掉情况7中的子表达式
__名称\¨¨¨主\”
(上文案例1至6)是必要的。
-
不应该是第二个子表达式
__包\uuuu不是
是
not __package__
相反,为了处理这个案子
__包装__
__main__.py
子模块从执行
提供包含目录的文件系统:
PYTHONPATH=$(pwd) python3 foo/
直接执行
工作(案例1到4以上),它不试图让其他口味
搜索路径