Я пытался найти 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? Это слишком непитонично?
Разве я не гроклю?
Возможно, я пытаюсь лишить динамических аспектов языка преимуществ. Это эгоистично, когда иногда требуется принудительная область видимости?
Я ленив, если мне нужен компилятор / интерпретатор поймать мои небрежные ошибки повторного использования переменных? Ну да я конечно ленивый, но разве я ленив?