我有一个帮助导入特殊类型文件的类,以及一个允许我批量执行这些操作的"工厂"类.工厂类使用生成器,因此客户端可以遍历导入器.我的问题是,我是否正确使用了迭代器?这是一个可以接受的成语吗?我刚开始使用Python.
class FileParser:
""" uses an open filehandle to do stuff """
class BatchImporter:
def __init__(self, files):
self.files=files
def parsers(self):
for file in self.files:
try:
fh = open(file, "rb")
parser = FileParser(fh)
yield parser
finally:
fh.close()
def verifyfiles(
def cleanup(
---
importer = BatchImporter(filelist)
for p in BatchImporter.parsers():
p.method1()
...
Run Code Online (Sandbox Code Playgroud)
Tim*_*ker 12
你可以做一件事更简单:而不是try...... finally,使用一个with块:
with open(file, "rb") as fh:
yield FileParser(fh)
Run Code Online (Sandbox Code Playgroud)
一旦with剩下块,这将自动关闭文件.
像你一样拥有一个生成器的方法是绝对没问题的.我建议你把所有类都改成新风格(如果你是在Python 2上,要么__metaclass__ = type在模块的开头设置,要么添加(object)到所有无基class语句中),因为遗留类是"邪恶的";-); 而且,为了清晰和简洁,我还建议不同地编码发生器...:
def parsers(self):
for afile in self.files:
with open(afile, "rb") as fh:
yield FileParser(fh)
Run Code Online (Sandbox Code Playgroud)
但这些建议都没有以任何方式谴责发电机方法的使用! - )
请注意使用afile代替file:后者是一个内置的标识符,作为一般规则,最好习惯不用自己的 "隐藏"内置标识符(它不会在这里咬你,但它除非你养成正确的习惯,否则将来会以许多令人讨厌的方式! - ).