这是一个可以接受的pythonic成语吗?

mik*_*ers 4 python

我有一个帮助导入特殊类型文件的类,以及一个允许我批量执行这些操作的"工厂"类.工厂类使用生成器,因此客户端可以遍历导入器.我的问题是,我是否正确使用了迭代器?这是一个可以接受的成语吗?我刚开始使用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剩下块,这将自动关闭文件.


Ale*_*lli 7

像你一样拥有一个生成器的方法是绝对没问题的.我建议你把所有类都改成新风格(如果你是在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:后者是一个内置的标识符,作为一般规则,最好习惯不用自己的 "隐藏"内置标识符(它不会在这里咬你,但它除非你养成正确的习惯,否则将来会以许多令人讨厌的方式! - ).