Блокировать область действия в Python - PullRequest
74 голосов
/ 29 мая 2011

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

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

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

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

Ответы [ 4 ]

65 голосов
/ 29 мая 2011

Нет, языковая поддержка для создания области видимости отсутствует. Единственным средством для создания области видимости являются функции, классы или модули.

34 голосов
/ 29 мая 2011

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

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

11 голосов
/ 20 июля 2017

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

10 голосов
/ 16 июня 2018

Я согласен, что нет блока блока. Но одно место в 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'

и этот ответ идет вразрез с ответчиком @ высказыванием Томаса Единственным средством для создания области видимости являются функции, классы или модули , поскольку это похоже на еще одно место создания новой области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...