禁止导入脚本的原因(如果有)是什么?



可执行脚本通常如下所示:

import modules
define some CONSTANTS, Classes, functions
if __name__ == "__main__":
really_do_something()

最近我看到一个使用普通成语否定形式的脚本:

if __name__ != "__main__":
print('The executable must not be imported.')
sys.exit(1)

我发现它不是Pythonic。为什么有人要阻止同意的成年人导入文件?有正当理由吗?

我找不到任何原因,除了与脚本底部附近的标准==保护相比,在脚本顶部编写此!=守卫更简单。

即使答案看起来很明显,考虑到Python导入系统的复杂性,我决定问一下只是为了确定。

考虑脚本立即执行操作的可能性。也就是说,脚本文件中的"模块范围"有命令:

#!/usr/bin/env python3
with open('/etc/passwd') as pwd:
...

在这种情况下,导入文件将导致运行这些命令。虽然它可能提供一些子例程或类定义,但它可能不会。

因此,发出警告说"你导入了这个,但你不应该,因为它不会做你想要的"是一件友好的事情。它确实说"此文件未设置为导入。如果需要此功能,请调用system">

这取决于。如果脚本只是一个快速而肮脏的脚本来做一些简单的事情,那么我认为导入它没有任何意义。只需将您需要的内容复制并粘贴到代码中即可完成(显然我假设有兼容的开源许可证)。

如果脚本是某些库/软件的一部分,那么最佳实践是每个脚本的形式应该是:

import argparse
from somewhere import main
args = <parse-arguments>
main(args)

换句话说:它不包含任何东西,它只是导入东西,解析命令行参数并调用main函数。在这种情况下,导入此脚本没有意义,因为它是空的。您可以自己执行导入,删除参数解析内容。

这就是这样的警卫可能有用的地方。由于导入脚本不会产生任何逻辑敏感性,因此也许您可以告诉用户,他们应该简单地导入main函数,而不是导入脚本。

但是,如果脚本很复杂,导入内容,定义类,函数,将各个部分粘合在一起等,那么是的,导入它确实有意义,在这种情况下,使用类似于您作为示例提供的防护限制了脚本的有用性。

但是请注意,脚本可能包含定义模块时执行的一些逻辑,在这种情况下,导入它可能毫无用处(但是应重构脚本以将此类逻辑放置在可以安全导入的函数中)。

相关内容

最新更新