我应该或者可以在导入的包或模块中使用:'if __name__ == "__main__:" 样式构造吗?

问题描述 投票:0回答:1

简单的Python文件

hello.py
在顶级环境中作为main执行:

#hello.py
def hello(input):
    print(f"hello, {input}")


if __name__ == '__main__':
    hello(input = 'world!')

我从 the docsprevious stackoverflow Q&A 知道,这种模式在独立脚本和简单包中有点正式,但这是一个很好的实践,并且对于防止脚本被执行非常重要(如果它是)作为模块导入,无需

if __name__ == '__main__':
条件。

我现在有一个模块

foobar.py
安装或临时添加到sys.path,我想将其导入到
hello.py
中,然后例如执行一个函数或实例化它在导入期间定义的一些类,(或者也许稍后在主脚本中):

#foobar.py
def foobar():
    print(f"foo bar baz")

它是否写在文档中的任何地方,或者暗示我可以或应该包含以下内容:

if __name__ == 'foobar':
    foobar()

if __name__ == '__main__':
类似,但在文件中作为导入执行?

这样做是为了保证在导入期间执行

foobar()
函数,而不是简单地在
foobar()
文件末尾或导入后从
foobar.py
内调用
hello.py
,据我所知,这将是在我能看到的所有情况下执行该函数!

同样,我是否也应该包括一个空白:

if __name__ == '__main__':
    pass

在我从来不打算作为主要运行的模块和脚本中?这样做时有什么明显的问题需要避免吗?

python design-patterns import package namespaces
1个回答
0
投票

如果你想在导入时执行某些操作,你不应该将其放在

if __name__ == '__main__':
守卫中,而且我从未见过有人检查其模块名称。这特别意味着在导入时不执行,而仅在作为脚本运行时执行。另外,不要在
pass
中包含空白,它是没有用的。

如果您想在导入时初始化模块,只需在顶层执行即可。然而,将此类内容保持在绝对最低限度是一个好主意,例如,将任何初始化逻辑保留在一个被调用的函数中,以保持一切井井有条。

但是如果 init 是必要的,我会说最好让调用者明确地执行它

© www.soinside.com 2019 - 2024. All rights reserved.