我不明白Python的主要区块。 那个东西是什么?
可能重复:
<if __name __ ==“__ main __”:>做什么?
所以我启动了pyscripter,并在其中获得了一个文件:
def main():
pass
if __name__ == '__main__':
main()
那是什么? 为什么我的程序在没有它的情况下工作? 无论如何,这是什么目的? 我的代码在哪里? 让我们说一个打印hello世界的函数。 那去哪里? 我会在哪里叫它?
目的基本上是,只要脚本直接运行,您就可以定义一个中央入口点。 因为__name__
只会等于'__main__'
,如果它自己运行。 将脚本的实际内容放入单独的函数中,可以让其他脚本导入所述函数,并在需要时运行它,因此脚本导入时不会立即运行。
当你只需要一些东西时,这在库文件模块中也经常用到一些默认行为。 例如, http.server
模块提供了广泛的功能来创建您自己的HTTP服务器,并提供您可以想到的任何功能。 如果您只想快速让一个简单的服务器侦听并静态传递文件,则可以在从命令行运行时使用该模块的默认行为。
在命令行上运行python3 -m http.server
将正好这样做; 运行http.server
模块,该模块本身将在其__name__ == '__main__
块中启动一个简单的HTTP服务器。
回应你的评论:
对于作为库的普通模块,包含应用程序需要的类型或函数,您不需要main
函数或主块。 对于直接调用的脚本,例如,实际启动应用程序的启动脚本,您将获得某种类型的代码,这些代码不会封装在函数或类中,而是直接运行。 那会是一些东西,你可以把它放在一个主函数中,然后你可以单独调用它。 这使您在放置代码的位置更自由一些。 例如,您可以直接在文件的开头部署main
功能,而在其中调用的其他功能则在文件中进一步定义。 然后脚本的最后部分是main()
。 你不一定需要把它放到if __main__ == '__main__':
条件中,你可以直接调用它。 例如,你的脚本可能看起来像这样:
def main ():
# doing something
utilityFunction(...)
otherUtilityFunction(...)
def utilityFunction (...):
...
def otherUtilityFunction (...):
...
main()
如果你不把代码放到一个单独的函数中,你必须在底部完成所有的处理(在你的函数定义之后),如果你只是想快速地看到你做什么的时候可能会适得其反。脚本被直接调用。
现在,正如我所说的,你不需要把它放到主条件块中; 你可以直接调用它。 但是,如果出于任何原因需要包含该文件,例如因为您想将其封装到其他某个东西中,或者如果要从交互式shell(IDLE或其他)中反复调用它,则可能不会只要你只是导入模块,但只有当你想要真正执行它的功能时才想运行main()
。 这就是你应该将main()
放入条件的地方; 这样它将不会被执行,除非你直接执行模块。
总的来说,总是把main()
调用放入这样一个条件并不是一个坏主意,因为它永远不会受到伤害,但在稍后的某个时刻往往会变得有用。
当你执行一个python文件时, __name__
global被设置为__main__
,而当你导入文件时,它被设置为它的名字。
该构造允许您仅在执行文件时执行一些代码。 例如,如果你有文件mymain.py
:
def main():
print('Hello, World!')
if __name__ == '__main__':
main()
你获得这个结果:
$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymain # main() *not* executed
>>> mymain.main()
Hello, World!
能够在不执行代码的情况下导入文件通常很有用。 通过这种方式,主要功能可以由第三方软件调用,而无需创建新流程,并允许他们在运行之前更改一些内容。
所以,这是没有必要的,但它是一个很好的习惯。 通常你会意识到某个程序的某些函数/类可能对另一个程序有用,所以能够在不执行主程序的情况下导入一个文件是一种很好的做法。
与具有if __name__ == '__main__':
block的Java相比,就像拥有一个只有一个main
方法并且使用其他类来完成他的工作的类,而不使用它,就像在类中有一个main
方法,它也提供了其他功能(例如某种类型的Container或任何具有执行主程序的main
方法)。
Python中的所有东西都是一个声明,没有声明的东西(例如, def
是创建函数对象并将其绑定到名称的语句)。 导入模块意味着(在一些簿记之后)执行模块中的语句。 同样,执行一个Python文件意味着将它作为模块导入。 因此,只需将程序编写为模块级别语句即可。
但是,当然,这是不可重用的。 当“程序”也应该可以导入其他模块时,可以将它放入一个函数中(并且还有一些其他的小优点)。 但是,然后执行该文件( python file.py
)不会做任何事情,但定义该功能。
输入__name__
,这是模块名称,等于“入口点”模块的'__main__'
。 因此,条件会检查模块是否已导入或作为脚本运行,并在后一种情况下执行其工作。
上一篇: I don't understand Python's main block. What is that thing?