Ответ 1
Нет, языковой поддержки для создания области видимости нет.
Следующие конструкции создают область действия:
- модуль
- класс
- функция (включая лямбду)
- выражение генератора
- понимание (dict, set, list (в Python 3.x))
При кодировании на других языках вы иногда создаете область блока, например:
statement
...
statement
{
statement
...
statement
}
statement
...
statement
Одна из целей (многих) заключается в улучшении читаемости кода: чтобы показать, что определенные операторы образуют логическую единицу или что определенные локальные переменные используются только в этом блоке.
Есть ли идиоматический способ сделать то же самое в Python?
Нет, языковой поддержки для создания области видимости нет.
Следующие конструкции создают область действия:
Идиоматический способ в Python - держать ваши функции короткими. Если вы думаете, что вам это нужно, рефакторинг вашего кода! :)
Python создает новую область видимости для каждого модуля, класса, функции, выражения генератора, понимания dict, понимания набора, а в Python 3.x также для каждого понимания списка. Кроме них, внутри функций нет вложенных областей действия.
Вы можете сделать что-то похожее на область действия блока C++ в Python, объявив функцию внутри вашей функции, а затем немедленно вызвав ее. Например:
def my_func():
shared_variable = calculate_thing()
def do_first_thing():
... = shared_variable
do_first_thing()
def do_second_thing():
foo(shared_variable)
...
do_second_thing()
Если вы не уверены, почему вы можете захотеть сделать это, это видео может убедить вас.
Основной принцип состоит в том, чтобы охватить все настолько узко, насколько это возможно, без введения какого-либо "мусора" (дополнительных типов/функций) в более широкую область, чем это абсолютно необходимо - ничто иное не хочет использовать метод do_first_thing()
например, так что это не должно быть выходит за пределы вызывающей функции.
Я согласен, что нет блока блока. Но одно место в Python 3 делает его SEEM, как если бы он имел область видимости блока.
что случилось, что дало этот взгляд? Это работало должным образом в Python 2. Но чтобы остановить переменную утечку в Python 3, они сделали этот трюк, и это изменение заставляет его выглядеть так, как будто у него есть область видимости блока здесь.
Позволь мне объяснить.
Согласно идее области действия, когда мы вводим переменные с одинаковыми именами внутри одной области действия, ее значение должно быть изменено.
это то, что происходит в Python 2
>>> x = 'OLD'
>>> sample = [x for x in 'NEW']
>>> x
'W'
Но в Python 3, даже если введена переменная с тем же именем, она не переопределяет, понимание списка действует по какой-то причине как песочница и похоже на создание в ней новой области видимости.
>>> x = 'OLD'
>>> sample = [x for x in 'NEW']
>>> x
'OLD'
и этот ответ идет вразрез с оператором answerer @Thomas . Единственное средство для создания области действия - это функции, классы или модули, потому что это похоже на еще одно место создания новой области.