docs: def parse_reaction_equation(equation_def, default_compartment):
      """Parse a structured reaction equation as obtained from a YAML file
  
      Returns a Reaction.
      """
  
      def parse_compound_list(l, compartment):
          """Parse a list of reactants or metabolites"""
          for compound_def in l:
              compound_id = compound_def.get('id')
              _check_id(compound_id, 'Compound')
  
              value = compound_def.get('value')
              if value is None:
                  raise ParseError('Missing value for compound {}'.format(
                      compound_id))
  
              compound_compartment = compound_def.get('compartment')
              if compound_compartment is None:
                  compound_compartment = compartment
  
              compound = Compound(compound_id, compartment=compound_compartment)
              yield compound, value
  
      if isinstance(equation_def, string_types):
          return parse_reaction_equation_string(
              equation_def, default_compartment)
      else:
          compartment = equation_def.get('compartment', default_compartment)
          reversible = bool(equation_def.get('reversible', True))
          left = equation_def.get('left', [])
          right = equation_def.get('right', [])
          if len(left) == 0 and len(right) == 0:
              raise ParseError('Reaction values are missing')
  
          return Reaction(Direction.Both if reversible else Direction.Forward,
                          parse_compound_list(left, compartment),
                          parse_compound_list(right, compartment))