Розділення імен
Оновлено: 28.04.2023
scope визначає видимість імені в блоці. Якщо локальна змінна визначена в блоці, її область включає цей блок. Якщо визначення міститься у функціональному блоці, область поширюється на будь-які блоки, що містяться в визначальному, якщо тільки блок не вводить іншу прив’язку для імені.
Коли ім’я використовується в блоці коду, воно розпізнається за допомогою найближчої охоплюючої області. Набір усіх таких областей, видимих для блоку коду, називається environment блоку.
Якщо ім’я взагалі не знайдено, виникає виняток NameError. Якщо поточна область є областю функції, а ім’я посилається на локальну змінну, яка ще не прив’язана до значення в точці, де використовується ім’я, виникає виняток UnboundLocalError. UnboundLocalError є підкласом NameError.
If a name binding operation occurs anywhere within a code block, all uses of the name within the block are treated as references to the current block. This can lead to errors when a name is used within a block before it is bound. This rule is subtle. Python lacks declarations and allows name binding operations to occur anywhere within a code block. The local variables of a code block can be determined by scanning the entire text of the block for name binding operations. See the FAQ entry on UnboundLocalError for examples.
Якщо оператор global зустрічається в блоці, усі використання імен, указаних у цьому операторі, посилаються на прив’язки цих імен у просторі імен верхнього рівня. Імена розпізнаються в просторі імен верхнього рівня шляхом пошуку в глобальному просторі імен, тобто в просторі імен модуля, що містить блок коду, і вбудованому просторі імен, просторі імен модуля builtins. Спочатку виконується пошук у глобальному просторі імен. Якщо імена там не знайдено, пошук здійснюється у вбудованому просторі імен. Оператор global має передувати всім використанням наведених імен.
Оператор global має ту саму область дії, що й операція прив’язки імені в тому самому блоці. Якщо найближча охоплююча область для вільної змінної містить глобальний оператор, вільна змінна розглядається як глобальна.
Оператор nonlocal змушує відповідні імена посилатися на раніше зв’язані змінні в найближчій охоплюючій області функції. SyntaxError викликається під час компіляції, якщо задане ім’я не існує в жодній охоплюючій області функції.
Простір імен для модуля створюється автоматично під час першого імпорту модуля. Основний модуль для сценарію завжди називається __main__.
Блоки визначення класу та аргументи для exec() і eval() є спеціальними в контексті розпізнавання імен. Визначення класу - це виконуваний оператор, який може використовувати та визначати імена. Ці посилання відповідають звичайним правилам розпізнавання імен, за винятком того, що незв’язані локальні змінні шукаються в глобальному просторі імен. Простір імен визначення класу стає словником атрибутів класу. Область імен, визначених у блоці класу, обмежена блоком класу; він не поширюється на блоки коду методів – це включає в себе розуміння та вирази генератора, оскільки вони реалізовані за допомогою області видимості функції. Це означає, що не вийде:
class A:
a = 42
b = list(a + i for i in range(10))