这是什么,为什么应该包括一个 if 声明?
if __name__ == "__main__":
print("Hello, World!")
如果你试图关闭一个问题,有人应该使用这个字符,而不是,考虑关闭作为一个复制为什么Python在我进口时运行我的模块,而我如何停止它? 问题,有人只是没有呼叫任何功能,或者错误地等待一个名为主的功能将自动作为一个输入点,使用为什么没有主()功能运行。
这是什么,为什么应该包括一个 if 声明?
if __name__ == "__main__":
print("Hello, World!")
如果你试图关闭一个问题,有人应该使用这个字符,而不是,考虑关闭作为一个复制为什么Python在我进口时运行我的模块,而我如何停止它? 问题,有人只是没有呼叫任何功能,或者错误地等待一个名为主的功能将自动作为一个输入点,使用为什么没有主()功能运行。
当前回答
如果 __name__ ==“__main__”:基本上是顶级脚本环境,并指定翻译者(‘我首先要执行的优先事项’)。
“__main__”是顶级代码执行范围的名称,当从标准输入、脚本或互动快点阅读时,模块的 __name__ 设置相当于“__main__”。
if __name__ == "__main__":
# Execute only if run as a script
main()
其他回答
只有你需要知道的事实
实际的机械是相当简单的,只有两个基本事实:
纯 Python 模块总是用“__main__”字符串设置的变量 __name__ 创建。 导入一个模块具有改变 __name__ 变量的副作用,而无需.py 扩展。
如何使用此信息
人們寫 __name__ == '__main__' 以測試是否有一個模組已被輸入。
通常有某些代码不应该在进口时运行:测试代码,一次使用代码,命令线前端或网页服务器前端。
正如你可以从其他答案中看到的那样,人们似乎能够无限地谈论这个主题,但它确实是一个简单的事情,并且很容易掌握。
例如,这是 test1.py 没有如果 __name__ ==“__main__”::
# "test1.py"
def hello()
print("Hello")
hello()
而且 test2.py 只輸入 test1.py:
# "test2.py"
import test1 # Here
然后,当运行 test2.py 时,一个 Hello 被打印,因为 test1.py 中的不需要的 hello() 代码也被运行:
python test2.py
Hello
当然,您可以在 test2.py 中拨打 test1.hello():
# "test2.py"
import test1
test1.hello() # Here
然后,当运行测试2时,印刷了两个Hello:
python test2.py
Hello
Hello
现在,添加如果 __name__ ==“__main__”:测试1.py 并将 hello() 放在下面:
# "test1.py"
def hello()
print("Hello")
if __name__ == "__main__":
hello()
此分類上一篇: Test2.py:
# "test2.py"
import test1
test1.hello()
然后,在运行 test2.py 时,只有一个 Hello 被打印,因为如果 __name__ ==“__main__”:在 test2.py 输入 test1.py 时阻止运行不需要的 hello() 代码:
python test2.py
Hello
此外, test1.py 是否有 __name__ == “__main__”: 或者不:
# "test1.py"
def hello()
print("Hello")
if __name__ == "__main__":
hello()
# "test1.py"
def hello()
print("Hello")
hello()
One Hello 在运行 test1.py 时正确打印:
python test1.py
Hello
所有答案都解释了功能性,但我会给出一个例子它的使用,这可能有助于进一步清理这个概念。
假设你有两个 Python 文件, a.py 和 b.py. 现在, a.py 输入 b.py. 我们运行 a.py 文件,其中输入 b.py 代码首先执行。
在 b.py 代码中,有一些代码是专属于 b.py 文件,我们不希望任何其他文件(除了 b.py 文件),已进口了 b.py 文件,运行它。
如果它是主要文件(即,b.py)运行代码,在这种情况下它不是(a.py是主要文件运行),那么只有代码被执行。
什么是 __name__?
哪里
>>> print(__name__)
__main__
>>>
此分類上一篇:file.py:
print(__name__)
结果在 __main__
主持人.py:
def somefunction():
print(__name__)
此分類上一篇:file.py:
import somefile
somefile.somefunction()
结果在Somefile
请注意,当在包或模块中使用时, __name__ 取出文件的名称. 实际模块或包路径的路径不被提供,但有自己的 DunderAlias __file__,这允许这样做。
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
现在回答如果 __name__ ==“__main__”:
如果是包含代码块的流量控制声明,则将执行,如果所提供的值是真实的,我们已经看到 __name__ 可以采取 __main__ 或它已从中进口的文件名。
这告诉我们,如果运行文件是主要文件(或您正在直接从翻译器运行),那么该条件必须执行。
模块
变量
也可以用 __name__ 做其他,不太常见但有用的事情,我会在这里展示一些:
if __name__ != '__main__':
# Do some useful things
运行一个条件,如果文件是主一个和另一个,如果它不是
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
如果我们有两本书,
#script1.py
print "Script 1's name: {}".format(__name__)
和
#script2.py
import script1
print "Script 2's name: {}".format(__name__)
此分類上一篇: Executing script1
Script 1's name: __main__
执行脚本2的结果是:
Script1's name is script1
Script 2's name: __main__
正如你可以看到的那样, __name__ 告诉我们哪个代码是“主要”模块,这是很好的,因为你只能写代码,并且不需要担心结构问题,如在 C/C++ 中,如果一个文件不执行一个“主要”函数,那么它不能作为一个可执行的编写,如果是这样,它不能用作图书馆。
箭头是进口链接. 对于三个模块,每个试图包含以前的模块代码,有六个文件(九个,计算实施文件)和五个链接. 这使得很难将其他代码纳入一个C项目,除非它是专门编写为图书馆。
此分類上一篇