[Biopython-dev] [Bug 2752] New: Context management for Bio.Entrez handles

bugzilla-daemon at portal.open-bio.org bugzilla-daemon at portal.open-bio.org
Sun Feb 8 13:30:14 EST 2009


http://bugzilla.open-bio.org/show_bug.cgi?id=2752

           Summary: Context management for Bio.Entrez handles
           Product: Biopython
           Version: 1.49
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Main Distribution
        AssignedTo: biopython-dev at biopython.org
        ReportedBy: eric.talevich at gmail.com


I'd like the following code to work:

def write_gbk(gi):
    with open("gi%s.gbk" % gi, 'w+') as outfile:
        with Entrez.efetch(db='protein, rettype='genbank', id=gi) as gbk:
            text = gbk.read()
        outfile.write(text)
    print "Wrote", gi


Since Python 2.5 it's been possible to use the "with" statement to ensure
handles are closed properly even if an exception occurs (PEP 343). There's also
a decorator, @contextlib.contextmanager, to make this feature easy to support,
but in general it works by adding the __enter__ and __exit__ methods to a
class.

To make Bio.Entrez work this way, we could just add @contextmanager decorators
to efetch() and the others, but that would break 2.3 & 2.4 compatibility, so,
it's probably best to make a factory class that returns handles on
instantiation, and includes __enter__ and __exit__ methods. The e* functions
would become trivial classes that derive from the factory; this would also make
it possible to remove the redundant code around the deprecated "cgi=None"
argument.


-- 
Configure bugmail: http://bugzilla.open-bio.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.


More information about the Biopython-dev mailing list