8.3. Metaprogramming Namespace
8.3.1. Globals
globals()
{'__name__': '__main__', '__builtins__': {...}}
print(__name__)
__main__
8.3.2. Variables
The way you always interacted with variables in Python is by using
their names directly. But you can also access them through the
globals()
dictionary:
globals()
{'__name__': '__main__', '__builtins__': {...}}
'x' in globals()
False
x = 1
'x' in globals()
True
globals()
{'__name__': '__main__', '__builtins__': {...}, 'x': 1}
You can also modify the value of a variable using the globals() dictionary:
x
1
globals()['x']
1
8.3.3. Functions
globals()
{'__name__': '__main__', '__builtins__': {...}}
'add' in globals()
False
def add(a, b):
return a + b
'add' in globals()
True
globals()
{'__name__': '__main__', '__builtins__': {...}, 'add': <function add at 0x...>}
add
<function add at 0x...>
add(1, 2)
3
add.__call__(1, 2)
3
globals()['add']
<function add at 0x...>
globals()['add'](1,2)
3
globals()['add'].__call__(1, 2)
3
8.3.4. Classes
globals()
{'__name__': '__main__', '__builtins__': {...}}
'User' in globals()
False
class User:
pass
'User' in globals()
True
globals()
{'__name__': '__main__', '__builtins__': {...}, 'User': <class '__main__.User'>}
User
<class '__main__.User'>
User()
<__main__.User object at 0x...>
globals()['User']
<class '__main__.User'>
globals()['User']()
<__main__.User object at 0x...>
8.3.5. Class Namespace
class User:
AGE_MIN = 18
AGE_MAX = 65
def __init__(self, firstname, lastname, age):
self.firstname = firstname
self.lastname = lastname
self.age = age
def login(self):
return 'Logged in'
def logout(self):
return 'Logged out'
result = vars(User)
type(result)
<class 'mappingproxy'>
result
mappingproxy({'__module__': '__main__',
'__firstlineno__': 1,
'AGE_MIN': 18,
'AGE_MAX': 65,
'__init__': <function User.__init__ at 0x...>,
'login': <function User.login at 0x...>,
'logout': <function User.logout at 0x...>,
'__static_attributes__': ('age', 'firstname', 'lastname'),
'__dict__': <attribute '__dict__' of 'User' objects>,
'__weakref__': <attribute '__weakref__' of 'User' objects>,
'__doc__': None})