Reputation: 5574
Google has a Python tutorial, and they describe boilerplate code as "unfortunate" and provide this example:
#!/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()
Now, I've heard boilerplate code being described as "seemingly repetitive code that shows up again and again in order to get some result that seems like it ought to be much simpler" (example).
Anyways, in Python, the part considered "boilerplate" code of the example above was:
if __name__ == '__main__':
main()
Now, my questions are as follows:
1) Does boilerplate code in Python (like the example provided) take on the same definition as the definition I provided? If so, why?
2) Is this code even necessary? It seems to me like the code runs whether or not there's a main method. What makes using this code better? Is it even better?
3) Why do we use that code and what service does it provide?
4) Does this occur throughout Python? Are there other examples of "boilerplate code"?
Oh, and just an off topic question: do you need to import sys
to use command line arguments in Python? How does it handle such arguments if its not there?
Upvotes: 41
Views: 66133
Reputation: 8897
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
Upvotes: 4
Reputation: 31
My main reason for coming to this page was a question similar to your question #3:
Why do we use that code and what service does it provide?
I read these explanations and still couldn't wrap my head around the concept, even though the answers were super detailed. I had to mess with a small example after reading those explanations to really understand what's going on.
This is what finally made sense to me:
# code that runs regardless if it's ran
# by itself or if it's imported
if __name__ == "__main__":
# code that runs only if this file is ran by itself
Hopefully this helps someone
Upvotes: 2
Reputation: 2391
I am equally confused by what the tutorial means by "boilerplate code": does it mean that this code can be avoided in a simple script? Or it is a criticism towards Python features that force the use of this syntax? Or even an invitation to use this "boilerplate" code?
I don't know, however, after many years of Python programming, I have at least clear what the different syntaxes do, even if I am probably still not sure on what is the best way of doing it.
Often you want to put at the end of the script code for tests or code that want to execute, but this has some implications/side-effects:
python script.py
) or by running from ipython shell (%run script.py
), but there is no way to run it from other scripts.The most basic mechanism to avoid to execute following code in all conditions, is the syntax:
if __name__ == '__main__':
which makes the code run only if the script is called or run, avoiding problem 1. The other two points still hold.
The "boilerplate" code with a separate main()
function, adds a further step, excluding also above points 2 and 3, so for example you can call a number of tests from different scripts, that sometimes can take another level (e.g.: a number of functions, one for each test, so they can be individually be called from outside, and a main that calls all test functions, without needs to know from outside which one they are).
I add that the main reason I find this structures often unsatisfying, apart from its complexity, is that sometimes I would like to maintain point 2 and I lose this possibility if the code is moved to a separate function.
Upvotes: 0
Reputation: 1
Let’s take a moment to see what happened when you called import sys
:
sys
moduleargv
function and runs itSo, 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:
main
, and main
existsYou essentially write your program under main
, using all the functions you defined just before defining main
(or elsewhere), and let Python look for main
.
Upvotes: 0
Reputation: 85
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! ;-)
Upvotes: 1
Reputation: 4210
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.
Upvotes: 9
Reputation: 39950
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.
Upvotes: 3
Reputation: 45039
Off topic question:
If you don't write code to check the arguments, they are ignored.
Upvotes: 27