“Boilerplate” code in Python?

孤街浪徒 提交于 2019-12-02 17:59:29
Winston Ewert
  1. It is repetitive in the sense that it's repeated for each script that you might execute from the command line.
  2. If you put your main code in a function like this, you can import the module without executing it. This is sometimes useful. It also keeps things organized a bit more.
  3. Same as #2 as far as I can tell
  4. Python is generally pretty good at avoiding boilerplate. It's flexible enough that in most situations you can write code to produce the boilerplate rather then writing boilerplate code.

Off topic question:

If you don't write code to check the arguments, they are ignored.

The reason that the if __name__ == "__main__": block is called boilerplate in this case is that it replicates a functionality that is automatic in many other languages. In Java or C++, among many others, when you run your code it will look for a main() method and run it, and even complain if it's not there. Python runs whatever code is in your file, so you need to tell it to run the main() method; a simple alternative would be to make running the main() method the default functionality.

So, if __name__ == "__main__": is a common pattern that could be shorter. There's no reason you couldn't do something different, like:

if __name__ == "__main__":
  print "Hello, Stack Overflow!"

  for i in range(3):
    print i

  exit(0)

This will work just fine; although my example is a little silly, you can see that you can put whatever you like there. The Python designers chose this behavior over automatically running the main() method (which may well not exist), presumably because Python is a "scripting" language; so you can write some commands directly into a file, run it, and your commands execute. I personally prefer it the Python way because it makes starting up in Python easier for beginners, and it's always nice to have a language where Hello World is one line.

The reason you use an "if main" check is so you can have a module that runs some part of its code at toplevel (to create the things – constants, functions, or classes – it exports), and some part only when executed as a script (e.g. unit tests for its functionality).

The reason the latter code should be wrapped in a function is because local variables of the main() block would leak into the module's scope.

Now, an alternate design could be that a file executed as a script would have to declare a function named, say, __main__(), but that would mean adding a new magic function name to the language, while the __name__ mechanism is already there. (And couldn't be removed, because every module has to have a __name__, and a module executed as a script has to have a "special" name because of how module names are assigned.) Introducing two mechanisms to do the same thing just to get rid of two lines of boilerplate – and usually two lines of boilerplate per application – just doesn't seem worth it.

crizCraig

You don't need to add a if __name__ == '__main__' for one off scripts that aren't intended to be a part of a larger project. See here for a great explanation. You only need it if you want to run the file by itself AND include it as a module along with other python files.

If you just want to run one file, you can have zero boilerplate:

print 1

and run it with $ python your_file.py

Adding the shebang line #!/usr/bin/python and running chmod +x print_one.py gets you the ability to run with

./print_one.py

Finally, # coding: utf-8 allows you to add unicode to your file if you want to put ❤'s all over the place.

Risto

1) main boilerplate is common, but cannot be any simpler

2) main() is not called without the boilerplate

3) the boilerplate allows module usage both as a standalone script, and as a library in other programs

4) it’s very common. doctest is another one.

Train to become a Python guru…and good luck with the thesis! ;-)

notnarayan

Let’s take a moment to see what happened when you called import sys:

  • Python looks at a list and brings in the sys module
  • It finds the argv function and runs it

So, what’s happening here?

A function written elsewhere is being used to perform certain operations within the scope of the current program. Programming in this fashion has a lots of benefits. It separates the logic from actual labour.

Now, as far as the boilerplate is concerned, there are two parts:

  • the program itself (the logic), defined under main, and
  • the call part that checks if main exists

You essentially write your program under main, using all the functions you defined just before defining main (or elsewhere), and let Python look for main.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!