Подтвердить что ты не робот

Область блока в Python

При кодировании на других языках вы иногда создаете область блока, например:

statement
...
statement
{
    statement
    ...
    statement
}
statement
...
statement

Одна из целей (многих) заключается в улучшении читаемости кода: чтобы показать, что определенные операторы образуют логическую единицу или что определенные локальные переменные используются только в этом блоке.

Есть ли идиоматический способ сделать то же самое в Python?

4b9b3361

Ответ 1

Нет, языковой поддержки для создания области видимости нет.

Следующие конструкции создают область действия:

  • модуль
  • класс
  • функция (включая лямбду)
  • выражение генератора
  • понимание (dict, set, list (в Python 3.x))

Ответ 2

Идиоматический способ в Python - держать ваши функции короткими. Если вы думаете, что вам это нужно, рефакторинг вашего кода! :)

Python создает новую область видимости для каждого модуля, класса, функции, выражения генератора, понимания dict, понимания набора, а в Python 3.x также для каждого понимания списка. Кроме них, внутри функций нет вложенных областей действия.

Ответ 3

Вы можете сделать что-то похожее на область действия блока 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() например, так что это не должно быть выходит за пределы вызывающей функции.

Ответ 4

Я согласен, что нет блока блока. Но одно место в 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 . Единственное средство для создания области действия - это функции, классы или модули, потому что это похоже на еще одно место создания новой области.