gpt4 book ai didi

python - __main__.py 中是否需要 "if __name__ == ' __main_ _'"?

转载 作者:行者123 更新时间:2023-12-04 11:50:34 26 4
gpt4 key购买 nike

在具有 __main__.py 的项目中, 而不是

# __main__.py
# def main...

if __name__ == "__main__":
main()

...可以这样做吗:
# __main__.py
# def main...

main()

编辑:

@user2357112-supports-Monica 的论点对我来说很有意义,所以我回过头来追踪给我带来问题的库,导致我仍在添加 if __...线。随叫随到 python -m pytest --doctest-modules .

也许这是唯一在运行 __main__.py 时出错的地方?也许这是一个错误?

通过将第一个示例放在 docs 中复制在 __main__.py :
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― package/__main__.py ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
package/__main__.py:58: in <module>
args = parser.parse_args()
/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py:1755: in parse_args
args, argv = self.parse_known_args(args, namespace)
/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py:1787: in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py:2022: in _parse_known_args
', '.join(required_actions))
/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py:2508: in error
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/argparse.py:2495: in exit
_sys.exit(status)
E SystemExit: 2
--------------------------------------------------------------------------------------- Captured stderr ---------------------------------------------------------------------------------------
usage: pytest.py [-h] [--sum] N [N ...]
pytest.py: error: the following arguments are required: N

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Results (4.23s):

最佳答案

可以跳过 if __name__ == '__main__'在大多数常规脚本中保护,而不仅仅是 __main__.py .守卫的目的是在文件作为模块导入而不是作为程序的入口点运行时使特定代码不运行,而是导入__main__.py因为一个模块通常使用它是错误的。

即使与 multiprocessing ,您可能认为您需要一个 if __name__ == '__main__'守卫,但在 __main__.py 的情况下,实际上并没有帮助。俗话说multiprocessing在 spawn 或 forkserver 模式下导入 __main__脚本作为一个模块,但这是对实际行为的简化。特别是,真实行为的一部分是,如果 spawn 模式检测到主脚本是 __main__.py , it just doesn't try to load the original __main__ at all :

# __main__.py files for packages, directories, zip archives, etc, run
# their "main only" code unconditionally, so we don't even try to
# populate anything in __main__, nor do we make any changes to
# __main__ attributes
current_main = sys.modules['__main__']
if mod_name == "__main__" or mod_name.endswith(".__main__"):
return

forkserver 模式也没有加载 __main__.py当我测试它时,但 forkserver 通过稍微不同的代码路径,我不确定它决定在哪里跳过 __main__.py .

(这在不同的 Python 版本上可能会有所不同 - 我只检查了 3.8.2。)

也就是说,使用 if __name__ == '__main__' 没有任何问题。 guard 。不使用它比使用它有更多奇怪的边缘情况,有经验的读者会因为它的缺失而不是它的存在而感到困惑。即使在 __main__.py ,我可能仍然会使用守卫。

如果您确实想导入 __main__.py出于某种原因,也许要在那里定义单元测试函数,那么您将需要守卫。但是,将任何值得导入的内容移出 __main__.py 可能更有意义。并进入另一个文件。

关于python - __main__.py 中是否需要 "if __name__ == ' __main_ _'"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61417426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com