RAII в Python - автоматическое уничтожение при выходе из области видимости

Я пытался найти RAII в Python. Распределение ресурсов - это инициализация - это шаблон в C ++, посредством которого объект инициализируется при создании. Если не получается, то бросает исключение. Таким образом, программист знает, что объект никогда не останется в незавершенном состоянии. Python

Но RAII также работает с правилами области видимости C ++ для обеспечения быстрого уничтожения объекта. Как только переменная выскакивает из стека и уничтожается. Это может произойти в Python, но только если нет внешних или циклических ссылок.

Что еще более важно, имя для объекта все еще существует, пока функция, которой оно является в выходах (а иногда и дольше). Переменные на уровне модуля будут оставайтесь на всю жизнь модуля.

Я бы хотел получить сообщение об ошибке, если сделаю что-то вроде этого:

for x in some_list:
    ...

... 100 lines later ...

for i in x:
    # Oops! Forgot to define x first, but... where's my error?
    ...

Я мог бы вручную удалить имена после того, как использовал его, но это было бы довольно уродливо и потребовало бы усилий с моей стороны.

И я бы хотел, чтобы в данном случае он делал-что-я-имею в виду:

for x in some_list:
    surface = x.getSurface()
    new_points = []
    for x,y,z in surface.points:
        ...     # Do something with the points
        new_points.append( (x,y,z) )
    surface.points = new_points
    x.setSurface(surface)

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

Python 2.5 имеет оператор with но для этого необходимо явно указать функции __ enter __ и __ exit __ и, как правило, больше ориентирован на очистку ресурсов, таких как файлы и блокировки мьютексов независимо от вектора выхода. Это не помогает с определением объема. Или мне что-то не хватает?

Я искал "Python RAII" и "Python scope" и не смог найти ничего, что решила вопрос напрямую и авторитетно. Я просмотрел всех PEP. Концепция не рассматривается в Python.

Я плохой человек, потому что хочу иметь переменные области видимости в Python? Это слишком непитонично?

Разве я не гроклю?

Возможно, я пытаюсь лишить динамических аспектов языка преимуществ. Это эгоистично, когда иногда требуется принудительная область видимости?

Я ленив, если мне нужен компилятор / интерпретатор поймать мои небрежные ошибки повторного использования переменных? Ну да я конечно ленивый, но разве я ленив?

31
задан markets 18 January 2019 в 16:35
поделиться