Google有一个Python教程,他们将样板代码描述为“不幸”并提供此示例:
#!/usr/bin/python
# import modules used here -- sys is a very standard one
import sys
# Gather our code in a main() function
def main():
print 'Hello there', sys.argv[1]
# Command line args are in sys.argv[1], sys.argv[2] ..
# sys.argv[0] is the script name itself and can be ignored
# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
main()
现在,我听说样板代码被描述为“看似重复的代码,一次又一次地出现,以便得到一些似乎应该更简单的结果”(example)。
无论如何,在Python中,上面例子中考虑“样板代码”的部分是:
if __name__ == '__main__':
main()
现在,我的问题如下:
1)Python中的样板代码(如提供的示例)是否与我提供的定义具有相同的定义?如果是这样,为什么?
2)这个代码是否必要?在我看来,代码运行是否有主要方法。是什么让这个代码变得更好?它更好吗?
3)为什么我们使用该代码及其提供的服务?
4)这是否会在整个Python中发生?还有“样板代码”的其他例子吗?
哦,只是一个偏离主题的问题:你需要import sys
在Python中使用命令行参数吗?如果它不在那里,它如何处理这些论点呢?
答案 0 :(得分:21)
非主题问题:
如果您不编写代码来检查参数,则会忽略它们。
答案 1 :(得分:6)
在这种情况下if __name__ == "__main__":
块被称为样板文件的原因是它复制了许多其他语言中自动的功能。在Java或C ++等许多其他程序中,当您运行代码时,它将查找main()
方法并运行它,甚至抱怨它是否存在。 Python运行文件中的任何代码,因此您需要告诉它运行main()
方法;一个简单的替代方法是使main()
方法成为默认功能。
因此,if __name__ == "__main__":
是一种可能更短的常见模式。你无法做出不同的事情,比如:
if __name__ == "__main__":
print "Hello, Stack Overflow!"
for i in range(3):
print i
exit(0)
这样可以正常工作;虽然我的例子有点傻,你可以看到你可以放任何你喜欢的东西。 Python设计者选择这种行为而不是自动运行main()
方法(可能不存在),可能是因为Python是一种“脚本”语言;因此,您可以将一些命令直接写入文件,运行它,并执行命令。我个人更喜欢它的Python方式,因为它使初学者更容易在Python中启动,并且总是很高兴有一个Hello World是一行的语言。
答案 2 :(得分:2)
你使用“if main”检查的原因是你可以有一个模块在顶层运行其代码的某些部分(创建东西 - 常量,函数或类 - 它导出),而只有一部分当作为脚本执行时(例如,单元测试其功能)。
后一个代码应该包含在函数中的原因是因为main()
块的局部变量会泄漏到模块的范围内。
现在,另一种设计可能是作为脚本执行的文件必须声明一个名为__main__()
的函数,但这意味着为该语言添加一个新的魔术函数名称,而{ {1}}机制已存在。 (并且无法删除,因为每个模块都必须有__name__
,并且作为脚本执行的模块必须具有“特殊”名称,因为模块名称的分配方式如何。)引入两个机制来执行同样的事情只是摆脱两行样板 - 通常每个应用程序两行样板 - 似乎不值得。
答案 3 :(得分:2)
您不需要为一个不打算成为大型项目一部分的脚本添加if __name__ == '__main__'
。有关详细说明,请参阅here。如果您想自己运行文件并将其作为模块与其他python文件一起包含,则只需要它。
如果您只想运行一个文件,则可以使用零样板:
print 1
并使用$ python your_file.py
Adding the shebang line #!/usr/bin/python
并且正在运行chmod +x print_one.py
,您可以使用
./print_one.py
最后,# coding: utf-8
允许您将unicode添加到您的文件中,如果您想将❤&#39全部放在一起。
答案 4 :(得分:1)
1)主样板是常见的,但不能更简单
2)没有样板
时不调用main()
3)样板文件允许将模块用作独立脚本,和作为其他程序中的库
4)这很常见。 doctest
是另一个。
培养成为一名Python大师......祝你好运! ; - )
答案 5 :(得分:0)
让我们花点时间看看你致电import sys
时发生了什么:
sys
模块argv
函数并运行它那么,这里发生了什么?
在其他地方编写的函数用于在当前程序的范围内执行某些操作。以这种方式编程有很多好处。它将逻辑与实际劳动分开。
现在,就样板文件而言,有两个部分:
main
和main
是否存在的呼叫部分您基本上使用在定义main
(或其他地方)之前定义的所有函数在main
下编写程序,并让Python查找main
。
答案 6 :(得分:0)
我同样对教程所说的以及在什么意义上感到困惑:这是否意味着可以在简单的脚本中避免此代码?或者是对强制使用这种语法的 Python 功能的批评?或者甚至是邀请使用这个“样板”代码?
然而,我不知道,经过多年的 Python 编程,我至少清楚不同语法的作用,即使我可能仍然不确定什么是最好的方法。
通常您想将要执行的测试或代码的脚本代码放在脚本的末尾,但这会产生一些影响/副作用:
python script.py
)或者从ipython shell运行(%run script.py
)来执行,但是没有办法从其他脚本运行.避免在所有条件下执行以下代码的最基本机制是语法:
if __name__ == '__main__':
这使得代码只有在脚本被调用或运行时才运行,避免了问题1。另外两点仍然成立。
带有单独 main()
函数的“样板”代码添加了一个进一步的步骤,也排除了上面的第 2 点和第 3 点,因此例如您可以从不同的脚本调用许多测试,有时可能需要另一个级别(例如:多个函数,每个测试一个,因此可以从外部单独调用它们,还有一个调用所有测试函数的 main,而无需从外部知道它们是哪个)。
我补充说,除了其复杂性之外,我发现这种结构通常不令人满意的主要原因是有时我想保持第 2 点,但如果将代码移至单独的函数,我将失去这种可能性。