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