Попробуем поменять порядок декораторов:
>>> @square_it
... @document_it
... def add_ints(a, b):
... return a + b
...
>>> add_ints(3, 5)
Running function: add_ints
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 8
64
Пространства имен и область определения
Имя может ссылаться на несколько разных вещей в зависимости от того, где оно
используется. Программы в Python могут иметь разные пространства имен — раз-
делы, внутри которых определенное имя уникально и не связано с такими же име-
нами в других пространствах имен.
Каждая функция определяет собственное пространство имен. Если вы опреде-
лите переменную, которая называется х в основной программе, и другую перемен-
ную х в отдельной функции, они будут ссылаться на разные значения. Но эту
стену можно пробить: если нужно, вы можете получить доступ к именам других
пространств имен разными способами.
В основной программе определяется глобальное пространство имен, поэтому пере-
менные, находящиеся в этом пространстве имен, являются глобальными.
Пространства имен и область определения
135
Вы можете получить значение глобальной переменной внутри функции:
>>> animal = 'fruitbat'
>>> def print_global():
... print('inside print_global:', animal)
...
>>> print('at the top level:', animal)
at the top level: fruitbat
>>> print_global()
inside print_global: fruitbat
Но если попробуете получить значение глобальной переменной и изменить его
внутри функции, получите ошибку:
>>> def change_and_print_global():
... print('inside change_and_print_global:', animal)
... animal = 'wombat'
... print('after the change:', animal)
...
>>> change_and_print_global()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in change_and_report_it
UnboundLocalError: local variable 'animal' referenced before assignment
Если вы просто измените его, изменится другая переменная, которая также на-
зывается animal, но находится внутри функции: