如果直接运行模块,我的印象是只执行 name =' main '下面的代码。但是,我在该语句上面看到一行mr = MapReduct.MapReduce()?如何执行,以及将其置于if子句之上的原因是什么?
import MapReduce
import sys
"""
Word Count Example in the Simple Python MapReduce Framework
"""
mr = MapReduce.MapReduce()
if __name__ == '__main__':
inputdata = open(sys.argv[1])
mr.execute(inputdata, mapper, reducer)
答案 0 :(得分:4)
当然,if __name__ == '__main__':
之前的所有代码都会被执行。脚本从上到下进行处理,找到的每个表达式或语句按顺序执行。但是if __name__ == '__main__':
行是特殊的:如果从命令行调用脚本,它将被运行。
按照惯例,if __name__ == '__main__':
行放在最后,以确保它所依赖的所有代码到目前为止都已经过评估。
看看其他question,了解该行中发生了什么。
答案 1 :(得分:3)
文件中的所有内容都会被执行,但是你在__name__ == '__main__'
之上放置的大多数内容只是函数或类定义 - 执行这些定义只是定义一个函数或类,并且不会产生任何明显的副作用。
例如,如果您在这些定义之外的文件中放置print
语句,则会看到一些输出。
答案 2 :(得分:2)
是的,整个脚本都已执行。
我们拥有主要防守的原因是让您的程序既可以用作独立脚本(在这种情况下__name__
变量定义为"__main__"
)或者从另一个python脚本导入为模块。在这种情况下,我们不希望运行任何代码,我们只希望代码的定义可供加载我们的人使用。
__main__
守卫的一个典型用法是在python文件独立运行时运行单元测试。例如,让我们假设我们有文件mymodule.py
:
def my_function(foo):
"""This function will add 54 to foo.
The following two lines are 'doctests' and can be run
automatically to show that the module's function work as expected.
>>> my_function(6)
60
"""
return foo + 54
if __name__ == "__main__":
import doctest
doctest.testmod() # this will run all doctests in this file
如果我们现在在命令行上运行它,将运行测试以检查模块是否按预期工作。
现在,我们可以从另一个文件或命令行导入mymodule.py
:
>>> import mymodule # Note that the tests will not be run when importing
>>> mymodule.my_function(3)
57
测试将无法运行,因为导入脚本时__name__
变量不会是__main__
。
您可以使用简单文件(test.py
)测试:
➤ cat test.py
#!/usr/bin/env python
print("my name is: ", __name__)
➤ python test.py
my name is: __main__
➤ python
Python 3.3.1 (default, Apr 6 2013, 19:11:39)
[GCC 4.8.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
my name is: test
>>>