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