Python中的“Boilerplate”代码?

时间:2011-10-26 02:14:39

标签: python boilerplate

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中使用命令行参数吗?如果它不在那里,它如何处理这些论点呢?

7 个答案:

答案 0 :(得分:21)

  1. 从您可能从命令行执行的每个脚本重复它是重复的。
  2. 如果将主代码放在这样的函数中,则可以导入模块而不执行它。这有时很有用。它还可以使事情更有条理。
  3. 据我所知,#2与#2相同
  4. Python通常非常擅长避免样板。它足够灵活,在大多数情况下,您可以编写代码来生成样板,而不是编写样板代码。
  5. 非主题问题:

    如果您不编写代码来检查参数,则会忽略它们。

答案 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时发生了什么:

  • Python查看列表并引入sys模块
  • 找到argv函数并运行它

那么,这里发生了什么?

在其他地方编写的函数用于在当前程序的范围内执行某些操作。以这种方式编程有很多好处。它将逻辑与实际劳动分开。

现在,就样板文件而言,有两个部分:

  • 程序本身(逻辑),在main
  • 下定义
  • 检查main是否存在的呼叫部分

您基本上使用在定义main(或其他地方)之前定义的所有函数在main下编写程序,并让Python查找main

答案 6 :(得分:0)

我同样对教程所说的以及在什么意义上感到困惑:这是否意味着可以在简单的脚本中避免此代码?或者是对强制使用这种语法的 Python 功能的批评?或者甚至是邀请使用这个“样板”代码?

然而,我不知道,经过多年的 Python 编程,我至少清楚不同语法的作用,即使我可能仍然不确定什么是最好的方法。

通常您想将要执行的测试或代码的脚本代码放在脚本的末尾,但这会产生一些影响/副作用:

  1. 即使导入脚本,代码也会被执行,这很少是我们想要的。
  2. 代码中的变量和值在调用命名空间中定义和导出
  3. 脚本末尾的代码可以通过调用脚本(python script.py)或者从ipython shell运行(%run script.py)来执行,但是没有办法从其他脚本运行.

避免在所有条件下执行以下代码的最基本机制是语法:

if __name__ == '__main__':

这使得代码只有在脚本被调用或运行时才运行,避免了问题1。另外两点仍然成立。

带有单独 main() 函数的“样板”代码添加了一个进一步的步骤,也排除了上面的第 2 点和第 3 点,因此例如您可以从不同的脚本调用许多测试,有时可能需要另一个级别(例如:多个函数,每个测试一个,因此可以从外部单独调用它们,还有一个调用所有测试函数的 main,而无需从外部知道它们是哪个)。

我补充说,除了其复杂性之外,我发现这种结构通常不令人满意的主要原因是有时我想保持第 2 点,但如果将代码移至单独的函数,我将失去这种可能性。