WP a écrit :
Hello group! This is probably a silly newbie mistake but consider the
following program:
import libsbml
def getSBMLModel(biomodel_path):
reader = libsbml.SBMLReader()
sbml_doc = reader.readSBML(biomodel_path)
sbml_model = None
if sbml_doc.getNumErrors() > 0:
print 'I couldn\'t read the file %s!' % biomodel_path
This should go to stderr. stdout is for normal program outputs.
return None
Also, Python has exception handling, which is usually a better solution
than returning None or whatever.
else:
since you returned in the other branch, this else is useless
sbml_model = sbml_doc.getModel()
return sbml_doc.getModel() # None if file couldn't be opened
You're calling sbml_doc.getModel() a first time, binding the returned
value to name sbml_model, then you're calling it a second time to return it.
A first fix:
import sys
def getSBMLModel(biomodel_path):
reader = libsbml.SBMLReader()
sbml_doc = reader.readSBML(biomodel_path)
if sbml_doc.getNumErrors() > 0:
# XXX : there's perhaps a better error message
# to get from sbml_doc ?
print >> sys.stderr, "I couldn't read the file %s!"\
% biomodel_path
return None
return sbml_doc.getModel()
def way_1(biomodel_path):
reader = libsbml.SBMLReader()
sbml_doc = reader.readSBML(biomodel_path)
sbml_model = sbml_doc.getModel()
if sbml_model == None:
Better to use the identity test here - None is garanteed to be a singleton:
if sbml_model is None:
return
l = sbml_model.getListOfSpecies()
print 'In way_1(): Got list %s with the length %i' % (l, len(l))
def way_2(biomodel_path):
sbml_model = getSBMLModel(biomodel_path)
if sbml_model == None:
return
l = sbml_model.getListOfSpecies()
print 'In way_2(): Got list %s with the length %i' % (l, len(l))
file = '../BIOMD0000000003.xml'
This shadows the builtin 'file' symbol. Better to use another name.
# Changing the order of these two calls doesn't help, only way_1() works.
way_1(file)
way_2(file)
When run, the output is:
In way_1(): Got list <libsbml.ListOfSpecies; proxy of <Swig Object of
type 'ListOfSpecies *' at 0x291c8bc> > with the length 3
In way_2(): Got list <libsbml.ListOfSpecies; proxy of <Swig Object of
type 'ListOfSpecies *' at 0x27fb57c> > with the length 0
I don't get it way the species list obtained in way_2() is empty?
The only explanation I can imagine here would be that a second call to
sbml_doc.getModel() doesn't return the same thing as the first...
(remember, there are two calls in your getSBMLModel() function).
My 2 cents...
--
http://mail.python.org/mailman/listinfo/python-list