このコードは、「IOException」がスローされた場合に常に「空」の文字列を返す FakeFile を作成するopen
別のオープンに対してモンキー パッチを適用します。open
目の前の問題に対して実際に書きたいと思うよりも多くのコードですがopen
、必要が再び発生した場合に偽造するための再利用可能なコンテキストマネージャーがあることを意味します(おそらく今後 10 年間で 2 回)。
with monkey_patched_open():
...
実際のコード。
#!/usr/bin/env python
from contextlib import contextmanager
from StringIO import StringIO
################################################################################
class FakeFile(StringIO):
def __init__(self):
StringIO.__init__(self)
self.count = 0
def read(self, n=-1):
return "<empty#1>"
def readlines(self, sizehint = 0):
return ["<empty#2>"]
def next(self):
if self.count == 0:
self.count += 1
return "<empty#3>"
else:
raise StopIteration
################################################################################
@contextmanager
def monkey_patched_open():
global open
old_open = open
def new_fake_open(filename, mode="r"):
try:
fh = old_open(filename, mode)
except IOError:
fh = FakeFile()
return fh
open = new_fake_open
try:
yield
finally:
open = old_open
################################################################################
with monkey_patched_open():
for line in open("NOSUCHFILE"):
print "NOSUCHFILE->", line
print "Other", open("MISSING").read()
print "OK", open(__file__).read()[:30]
上記を実行すると、次のようになります。
NOSUCHFILE-> <empty#3>
Other <empty#1>
OK #!/usr/bin/env python
from co
何が起こっているのかを示すために、「空の」文字列を残しました。
StringIO
一度読むだけで十分だったでしょうが、OPはファイルから読み続けようとしていると思ったので、FakeFileが必要です-誰かがより良いメカニズムを知らない限り。
モンキーパッチを悪党の行為と見なす人がいることを私は知っています。