Rules ๐
You can name a variable any name as long as it follows these rules:
- it can be only on word
- it can only use letters, numbers and the underscore character
- it can't start with a number
# DO
correct_variable_name_1 = "Hello"
# DON'T
incorrect variable = "Can be only one word."
&-incorrect#@variable = "Can only use letters, numbers and the underscore character"
123_incorrect_variable = "Can't start with a number."
Bonus: underscore in Python ๐
PEP 8 define a few rules around using underscore in variable names.
Name starting with an underscore: Weak internal use
Variables starting with _ are considered unuseful , internal or private.
When importing automatically everything from a module (from MODULE import *
), variables starting with an _
won't get automatically imported.
# example.py
_secret = "I am secret!"
public = "I am public"
# main.py
from test import *
print(public)
print(_secret)
# >> ๐ด NameError: name '_secret' is not defined
However, this is weak
as nothing stops you from forcing the import of the variable.
# example.py
_secret = "I am secret!"
public = "I am public"
# main.py
from test import _secret
print(_secret)
# >> "I am secret!"
Name ending with an underscore: Avoid conflicts
A variable name might end with an underscore to avoid conflicts with Python keywords.
# we use `class_` to avoid conflict with Python's class declaration keyword
class_ = "ClassName"
Name starting with two underscores: Name mangling
Using two underscores when naming a class attribute invokes name mangling.
For example, inside the class Cat
, the attribute __name
can be accessed with _Cat__name
.
class Cat:
def __init__(self, name):
self.__name = name
cat = Cat("Felix")
print(cat.__name)
# >> ๐ด AttributeError: 'Cat' object has no attribute '__name'
print(cat._Cat__name)
# >> Felix
Why use name-mangling?
Python doesn't have the concept of private/public attributes in class. Name mangling is a way to make the attribute somewhat more private.
However, a user could still access the variable by calling its mangled name (cat._Cat__name
in our example).
Name starting with two underscores and ending with two underscores: Magic attributes and object
Naming a variable with two underscores at the front and two underscores at the end indicates a magic attribute or object.
For example, __init__
is a magic attribute of a class
that is called when an instance is created. In other words, __init__
defines our constructor.