Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this an acceptable pythonic idiom?

Tags:

python

I have a class that assists in importing a special type of file, and a 'factory' class that allows me to do these in batch. The factory class uses a generator so the client can iterate through the importers. My question is, did I use the iterator correctly? Is this an acceptable idiom? I've just started using 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()
  ...
like image 494
mikewaters Avatar asked Nov 30 '22 10:11

mikewaters


2 Answers

You could make one thing a little simpler: Instead of try...finally, use a with block:

with open(file, "rb") as fh:
    yield FileParser(fh)

This will close the file for you automatically as soon as the with block is left.

like image 99
Tim Pietzcker Avatar answered Dec 05 '22 17:12

Tim Pietzcker


It's absolutely fine to have a method that's a generator, as you do. I would recommend making all your classes new-style (if you're on Python 2, either set __metaclass__ = type at the start of your module, or add (object) to all your base-less class statements), because legacy classes are "evil";-); and, for clarity and conciseness, I would also recomment coding the generator differently...:

  def parsers(self):
    for afile in self.files:
        with open(afile, "rb") as fh:
            yield FileParser(fh)

but neither of these bits of advice condemns in any way the use of generator methods!-)

Note the use of afile in lieu of file: the latter is a built-in identifier, and as a general rule it's better to get used to not "hide" built-in identifiers with your own (it doesn't bite you here, but it will in many nasty ways in the future unless you get into the right habit!-).

like image 20
Alex Martelli Avatar answered Dec 05 '22 19:12

Alex Martelli