[英]python class file context manager
我正在嘗試在一個類中打開一個文件,並以這種方式在退出時將其關閉。
class PlanetaryImage(object):
@classmethod
def open(cls, filename):
with open(filename, 'rb') as fp:
return cls(fp, filename)
def __init__(self, stream, filename=None, memory_layout='DISK'):
self.filename = filename
self._parse_data(stream)
def _parse_data(self, stream):
data_stream = stream
try:
if self.data_filename is not None:
dirpath = os.path.dirname(self.filename)
data_file = os.path.abspath(
os.path.join(dirpath, self.data_filename))
data_stream = open(data_file, 'rb')
data_stream.seek(self.start_byte)
if self.format in self.BAND_STORAGE_TYPE:
return getattr(self, self.BAND_STORAGE_TYPE[self.format])(data_stream)
raise Exception('Unkown format (%s)' % self.format)
finally:
data_stream.close()
在某些情況下,我不得不在_parse_data
函數中_parse_data
打開一個文件。 我想with
if
一起使用with
但很難。 關於如何使try部分更具pythonic的任何建議。
_parse_data
沒有理由嘗試打開文件。 調用者有責任使用帶文件名的PlanetaryImage.open
或提供__init__
的打開文件句柄。 _parse_data
應該只做一件事:從其流參數解析數據。
class PlanetaryImage(object):
@classmethod
def open(cls, filename):
with open(filename, 'rb') as fp:
return cls(fp, filename)
def __init__(self, stream, memory_layout='DISK'):
self._parse_data(stream)
def _parse_data(self, data_stream):
try:
data_stream.seek(self.start_byte)
if self.format in self.BAND_STORAGE_TYPE:
return getattr(self, self.BAND_STORAGE_TYPE[self.format])(data_stream)
raise Exception('Unkown format (%s)' % self.format)
finally:
data_stream.close()
現在,只有兩個使用該類的選項:
with open(filename, 'rb') as fp:
x = PlanetaryImage(fp)
...
要么
x = PlanetaryImage(filename)
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.