以前は常にファイルを開いて、pickle.load(file) を使用して、それを処理する必要があるプロジェクトがあったためです。 。 。最後にファイルを閉じる必要があるため、少し面倒に感じられ、コードも簡潔ではありません。したがって、解決策として Python のステートメントを調べてください。
インターネット上の記事 http://effbot.org/zone/python-with-statement.htm で with を紹介しているのを見て、例を参考に理解しました。
このようなコード セグメントが頻繁にある場合は、いくつかの方法で改善できます。
コードスニペット:
set thing up try: do something except : handle exception finally: tear thing down
ケース 1:
このような関数を今実装したい場合は、ファイルを開き、ファイルからデータを読み取り、端末に出力して、ファイルを閉じます。
論理的には「端末への印刷」は機能として独立すべきデータ処理部分として抽出できます。ファイルを開いたり閉じたりするなどの他の作業は一緒に行う必要があります。
ファイル名: for_test.txt
方法 1:
関数を使って共通部分を抽出します。
#!/usr/bin/env python from __future__ import with_statement filename = 'for_test.txt' def output(content): print content #functio solution def controlled_execution(func): #prepare thing f = None try: #set thing up f = open(filename, 'r') content = f.read() if not callable(func): return #deal with thing func(content) except IOError, e: print 'Error %s' % str(e) finally: if f: #tear thing down f.close() def test(): controlled_execution(output) test()
方法 2:
yield を使用して、アイテムを 1 つだけ生成するジェネレーターを実装します。 for - in をループスルーします。
コードスニペットは次のとおりです:
#yield solution def controlled_execution(): f = None try: f = open(filename, 'r') thing = f.read() #for thing in f: yield thing except IOError,e: print 'Error %s' % str(e) finally: if f: f.close() def test2(): for content in controlled_execution(): output(content)
方法 3:
with で実装するにはクラスメソッドを使用します。
コードスニペットは次のとおりです:
#class solution class controlled_execution(object): def __init__(self): self.f = None def __enter__(self): try: f = open(filename, 'r') content = f.read() return content except IOError ,e: print 'Error %s' % str(e) #return None def __exit__(self, type, value, traceback): if self.f: print 'type:%s, value:%s, traceback:%s' % \ (str(type), str(value), str(traceback)) self.f.close() def test3(): with controlled_execution() as thing: if thing: output(thing)
方法 4:
実装するには with を使用します。ただし、例外処理機能はありません。
def test4(): with open(filename, 'r') as f: output(f.read()) print f.read()
print の最後の文は、f が閉じられているかどうかをテストするために使用されます。
最後に要約すると、この記事を書く目的は主に「言語の良い機能を使用し、悪い機能は使用しないでください」という一文によって刺激されています。 Python には本当に多くのエレガントで優れた機能がありますが、道のりはまだ長く、引き続き探索していきます。 。 。