Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I don't understand Python's main block. What is that thing? [duplicate]

Tags:

python

Possible Duplicate:
What does <if __name__==“__main__”:> do?

So I start up pyscripter and I get a file with this in it:

def main():
    pass

if __name__ == '__main__':
    main()

What is that? Why does my program work without it as well? Whats the purpose for this anyway? Where would my code go? Lets say a a function that prints hello world. Where would that go? where would I call it?

like image 831
user836087 Avatar asked Nov 10 '12 16:11

user836087


People also ask

What is the __ main __ in Python?

In Python, the special name __main__ is used for two important constructs: the name of the top-level environment of the program, which can be checked using the __name__ == '__main__' expression; and. the __main__.py file in Python packages.

Can Python run without main?

There's no requirement to have a main function in Python, but there is the concept of a main module.

What is a block of Python code called?

4.1. A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition.

Does Python have a main?

Some programming languages have a special function called main() which is the execution point for a program file. Python interpreter, however, runs each line serially from the top of the file and has no explicit main() function.


2 Answers

The purpose is basically that you can define a central entrypoint, if, and only if, the script is directly run on its own. Because __name__ will only ever be equal to '__main__', if it is run on its own. Putting your script’s actual content into a separate function allows other scripts to import said function and run it whenever they want it, so it won’t run immediately when the script is imported.

This is also often used in libary modules to have some default behaviour when you just need something quickly. For example the http.server module offers a wide functionality to create your own HTTP server with whatever features you can think of. If you just want to quickly have a simple server listen and pass files statically, you can just use the module’s default behaviour when run from the command line.

Running python3 -m http.server on the command line will exactly do that; run the http.server module, which itself will start a simple HTTP server in its __name__ == '__main__ block.

In response to your comment:

For normal modules, that act as libraries, contain types or functions, your application needs, you don’t need a main function or main block. For scripts that are called directly, for example your starting script that actually launches your application you will have some kind of code that is not encapsulated in functions or classes but that runs directly. That would be something, you could put in a main function which you then call separately. This gives you a bit more freedom to where you put that code. For example you can have the main function directly at the beginning of the file, while additional functions that are called within it are defined further into the file. And the very last part of the script is then the main(). You don’t necessarily need to put that into a if __main__ == '__main__': condition, you could just call it directly. So for example your script could look like this:

def main ():
    # doing something
    utilityFunction(...)
    otherUtilityFunction(...)

def utilityFunction (...):
    ...
def otherUtilityFunction (...):
    ...

main()

If you don’t put the code into a separate function, you’d have to do all the processing at the bottom (after your function definitions) and that might be counter-productive if you just want to quickly see what you do when the script is directly called.

Now, as I said, you don’t need to put that into main-condition block; you can just call it directly. However, if for whatever reason you ever need to include that file, for example because you want to encapsulate it into some other thing, or if you want to call it repeatedly from an interactive shell (IDLE or something), you probably don’t want to run main() whenever you just import the module but only when you want to actually execute its functionality. That’s where you should put the main() into the condition; that way it won’t get executed unless you are directly executing the module.

In general, it’s not a bad idea to always put the main() call into such a condition, as it will never hurt but often turn useful at some later point.

like image 52
poke Avatar answered Nov 15 '22 15:11

poke


The __name__ global is set to __main__ when you execute a python file, while when you import the file it is set to it's name.

That construct allows you to execute some code only if the file is executed. For example if you have the file mymain.py:

def main():
    print('Hello, World!')


if __name__ == '__main__':
    main()

You obtain this results:

$ python mymain.py
Hello, World!
$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymain    # main() *not* executed
>>> mymain.main()
Hello, World!

It's often useful to being able to import a file without having code executed. In this way the main function can be called by third party software without having to create a new process and allowing them to change some things before running it.

So, it is not necessary but it is good practice to use it. Often you'll realize that some functions/classes of a program could be useful by an other program, so being able to import a file without having the main program be executed is good practice.

Comparing to Java having an if __name__ == '__main__': block is like having a class that has only a main method and uses other classes to do his job, while not using it is like having a main method inside a class that also provide other functionality(e.g. some kind of Container or whatever with also a main method that executes the main program).

like image 29
Bakuriu Avatar answered Nov 15 '22 14:11

Bakuriu