What's in a __name__?
Remember that my_module.py
is in itself a Python script. So we can actually type some code to do things like below.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FACTOR = 5
class Monster:
def __init__(self, name="Me", food="cookies"):
self.name = name
self.food = food
def talk(self):
print(f"{self.name} love {self.food}!")
def spawn_monsters():
return [Monster("Happy", "carrots"),
Monster("Bashful", "ice-creams"),
Monster("Wild", "cookies")]
def calculate_growthrate(adjustment=3):
return 25 * FACTOR + adjustment
monster = Monster("Silly", "pizza")
monster.talk()
When you run the code with python3 my_module.py
, it will print “Silly love pizza!”.
When you run python3 my_script.py
(which import my_module
), it will also print “Silly love pizza!”.
However, we do not want to see the code running when we import my_module
– it is a library for people to use our functions/classes/variables after all.
We only want it to run when we execute my_module
as a script (perhaps we just want to test that our class works). Can we do that? Of course!
What we do is to exploit the fact that Python will set a special variable __name__
as "__main__"
only when you run your code as a script (e.g. using python3 my_module.py
). So we just check that and only run our code when __name__ == "__main__"
!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FACTOR = 5
class Monster:
def __init__(self, name="Me", food="cookies"):
self.name = name
self.food = food
def talk(self):
print(f"{self.name} love {self.food}!")
def spawn_monsters():
return [Monster("Happy", "carrots"),
Monster("Bashful", "ice-creams"),
Monster("Wild", "cookies")]
def calculate_growthrate(adjustment=3):
return 25 * FACTOR + adjustment
if __name__ == "__main__":
monster = Monster("Silly", "pizza")
monster.talk()
Now, if you run python3 my_module.py
, you will see Silly love pizza!
But if you run python3 my_script.py
which imports my_module
, you will not see this.
While it is tempting to think of this as a main()
function as in C++, it is not quite the same since Python does not have or need a main function. So it is better not to think that way!