简单的Python文件
hello.py
在顶级环境中作为main执行:
#hello.py
def hello(input):
print(f"hello, {input}")
if __name__ == '__main__':
hello(input = 'world!')
我从 the docs 和 previous 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
在我从来不打算作为主要运行的模块和脚本中?这样做时有什么明显的问题需要避免吗?
如果你想在导入时执行某些操作,你不应该将其放在
if __name__ == '__main__':
守卫中,而且我从未见过有人检查其模块名称。这特别意味着在导入时不执行,而仅在作为脚本运行时执行。另外,不要在pass
中包含空白,它是没有用的。
如果您想在导入时初始化模块,只需在顶层执行即可。然而,将此类内容保持在绝对最低限度是一个好主意,例如,将任何初始化逻辑保留在一个被调用的函数中,以保持一切井井有条。
但是如果 init 是必要的,我会说最好让调用者明确地执行它