あなたの質問に直接答えるには:with
の最後で閉じることで何の害も見られません ブロック。この場合、なぜそれが行われないのかは言えません。しかし、この質問には活動が不足しているため、コード履歴を検索して、いくつかの考えを投げかけます(推測 )close()
の理由について 可能性があります 呼ばれない:
-
nextset()
の呼び出しをスピンスルーする可能性はわずかです。 例外をスローする可能性があります-おそらくこれは観察され、望ましくないと見なされていました。これが、新しいバージョンのcursors.py
close()
にこの構造が含まれています :def close(self): """Close the cursor. No further queries will be possible.""" if not self.connection: return self._flush() try: while self.nextset(): pass except: pass self.connection = None
-
何もせずに残りのすべての結果をスピンスルーするのに時間がかかる可能性がある(やや遠い)可能性があります。したがって、
close()
不必要な反復を避けるために呼び出されない場合があります。これらのクロックサイクルを節約する価値があるかどうかは主観的なものだと思いますが、「必要ない場合は実行しないでください」という方針に沿って議論することもできます。 -
sourceforgeコミットを参照すると、このコミットによって機能がトランクに追加されました / a> 2007年に、
connections.py
のこのセクションは それ以来変わっていません。これは、このコミット に基づくマージです。 、メッセージがありますそして、あなたが引用するコードはそれ以来変更されていません。
これは私の最終的な考えを促します-それはおそらく、機能したばかりで変更されなかった最初の試み/プロトタイプです。
より新しいバージョン
コネクタのレガシーバージョンのソースにリンクします。同じライブラリのよりアクティブなフォークがあることに注意してください
このモジュールの最新バージョンでは、__enter__()
が実装されていることに注意してください。 および__exit__()
cursor
内 それ自体:こちらをご覧ください
。 __exit__()
ここでします self.close()
おそらくこれは、with構文を使用するためのより標準的な方法を提供します。例:
with conn.cursor() as c:
#Do your thing with the cursor
エンドノート
N.B. conn
への参照がなくなったら、ガベージコレクション(専門家でもない)を理解している限り、追加する必要があると思います。 、割り当てが解除されます。この時点では、カーソルオブジェクトへの参照はなく、割り当ても解除されます。
ただし cursor.close()
を呼び出す ガベージコレクションされるという意味ではありません。結果を焼き尽くし、接続をNone
に設定するだけです。 。つまり、再利用することはできませんが、すぐにガベージコレクションされることはありません。 cursor.close()
を手動で呼び出すことで、そのことを確信できます。 with
の後 ブロックしてから、たとえば、cursor
の属性を出力します。
N.B。 2 これはwith
のやや珍しい使い方だと思います conn
としての構文 オブジェクトはすでに外部スコープにあるため、存続します。たとえば、より一般的なwith open('filename') as f:
とは異なります。 with
の終了後に参照でぶら下がっているオブジェクトがない場合 ブロック。