Python 是否有在导入时退出模块的命令,如函数的return

Python 是否有在导入时退出模块的命令,如函数的return,python,python-import,Python,Python Import,在python中导入模块时,模块代码为“run”。有时,在模块中使用分支逻辑是很有用的,例如检查包版本或平台等。是否有一种方法可以在到达文件末尾之前退出整个模块执行,这相当于函数中的提前返回 如果模块作为脚本运行,则可以退出(),但这会主动引发异常并终止整个过程。我只想说,你现在完成了,不要再运行下面的代码了 基本上我可以转换这个吗 if not <condition>: MY_CONSTANT = 3.14 class blah(): ...

在python中导入模块时,模块代码为“run”。有时,在模块中使用分支逻辑是很有用的,例如检查包版本或平台等。是否有一种方法可以在到达文件末尾之前退出整个模块执行,这相当于函数中的提前返回

如果模块作为脚本运行,则可以退出(),但这会主动引发异常并终止整个过程。我只想说,你现在完成了,不要再运行下面的代码了

基本上我可以转换这个吗

if not <condition>:
    MY_CONSTANT = 3.14
    class blah():
       ...

    def foo(x):
       ...

    # rest of module....
如果没有:
MY_常数=3.14
类blah():
...
def foo(x):
...
#模块的其余部分。。。。
进入

如果:
从模块返回
MY_常数=3.14
类blah():
...
def foo(x):
...
#模块的其余部分。。。。

大多数情况下,这样我就不必有很多代码看起来奇怪地多了一个缩进级别。

这有点蹩脚,但是如果您有一个模块
mylib.py
,看起来像这样:

import sys

print("mylib - before sys.exit")
sys.exit(0)
print("mylib - after sys.exit")
然后是另一个导入它的文件:

try:
    import mylib
except SystemExit:
    pass

print("Done")
输出:

mylib - before sys.exit
Done
>>> 
您可以创建一个用于特殊情况(例如,
ImportError
(1))的自定义设置,作为停止的快捷方式。这可以通过位于的自定义帐户进行注册

因此,如果要导入以下模块:

#foo.py
x=1
在此处停止模块执行
y=2
您可以使用以下查找器/加载程序导入该模块。它将一直执行,直到到达
raise importorror

导入导入库
类加载器(importlib.machine.SourceFileLoader):
def执行模块(自身,模块):
尝试:
super().exec_模块(模块)
除ImportError外:#模块选择停止执行
通过
类查找器(importlib.machinery.PathFinder):
@类方法
def find_规格(cls,全名,路径=无,目标=无):
spec=super()。查找_spec(全名、路径、目标)
如果“规格”不是“无”:
spec.loader=装入器(spec.name,spec.origin)#注册自定义装入器
退货规格
导入系统
sys.meta_path.insert(2,Finder())#从现在起,将查询自定义Finder以进行导入
进口食品
打印(foo.x)#打印1
打印(foo.y)#引发属性错误


(1) 使用
ImportError
指示快捷方式显然有其缺点,例如如果您的模块尝试导入其他不存在的内容,则不会将其报告为错误,但模块只是停止执行。因此,最好使用一些自定义异常。出于示例的考虑,我只是使用了
importorror

但这意味着如果模块
mylib
选择了执行的快捷方式,则该模块将不可用。这强烈建议分支逻辑不属于模块本身,并且/或者应该将代码拆分为单独的模块。@ekhumoro是的,我认为是您的想法独立模块的定义是有意义的。在本例中,我试图处理不同设置之间的兼容性,因此实际上将某些平台所需的额外代码拆分为一个新模块,非常重要的是,在if语句中,这是一个整洁的解决方案(但我接受了下面的答案,因为这是一个关于更深层魔法的极好答案)
mylib - before sys.exit
Done
>>>