3

我的印象是,如果您直接运行模块,则只会执行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)
4

3 回答 3

4

当然,之前的所有代码if __name__ == '__main__':都会被执行。从上到下处理一个脚本,找到的每个表达式或语句都按顺序执行。但这if __name__ == '__main__':条线很特别:如果从命令行调用脚本,它将运行。

按照惯例,该if __name__ == '__main__':行放在最后,以确保它所依赖的所有代码都已被评估。

看看这个其他问题,以了解该行发生了什么。

于 2013-06-11T22:55:54.317 回答
3

文件中的所有内容都已执行,但您在上面放置的大部分内容__name__ == '__main__'只是函数或类定义——执行那些只是定义了一个函数或类,不会产生任何明显的副作用。

print例如,如果您在这些定义之外的文件中添加一条语句,您将看到一些输出。

于 2013-06-11T22:56:38.960 回答
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
>>> 
于 2013-06-11T23:06:07.633 回答