Я должен использовать atexit, чтобы закрыть подключение к БД?


Я просто понял, что я мог повернуть:

import MySQLdb

def main():
    db = MySQLdb.connect( .. )
    try:
        while True:
           do_thingy()
    finally:
        db.close()

в:

import MySQLdb, atexit

def main():
    db = MySQLdb.connect( .. )
    atexit.register( db.close )
    while True:
        do_thingy()

Которые позволят мне сохранить код для закрытия базы данных рядом с открытием, и экономит мне строку кода и уровень вложенности, который мне нравится. Есть причина, почему я не должен этого делать?



1430
4
задан 12 марта 2011 в 10:03 Источник Поделиться
Комментарии
1 ответ

Во-первых, альтернативу:

import MySQLdb, contextlib

def main():
db = MySQLdb.connect( .. )
with contextlib.closing(db):
do_thingy()

Подключение к базе данных будет закрыт после блока даже в случае исключения.

Основная проблема создается atexit в Любая попытка повторно использовать этот код в вопрос. Он только выпустит подключение к базе данных, когда программа завершает свою работу. Это нормально в том случае, когда эта функция всю вашу программу. Но в какой-то момент, что моя перестанет быть.

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

Там действительно не так много сбережений, чтобы использовать маршрут atexit. Я думаю, что ясность в "с" методом стоит дополнительный уровень отступа. Кроме того, вы можете использовать этот же метод в любом месте в коде, не только в функции main.

14
ответ дан 13 марта 2011 в 01:03 Источник Поделиться