2011-06-02 3 views
0

J'ai essayé ceci:Quelle est la meilleure façon d'analyser un tuple à partir d'une chaîne en Python?

def string_to_value(self, old_value, distribution_type, new_value_str): 
    parameter_names = distribution_type.parameters # a list of string 
    try: 
     parameter_values = ast.literal_eval(new_value_str) # a tuple or basic type hopefully 
    except SyntaxError: 
     raise ValueError('Syntax error during parse') 
    retval = copy.copy(old_value) 
    try: 
     if len(parameter_names) == 1: 
      setattr(retval, parameter_names[0], parameter_values) 
     else: 
      if len(parameter_names) != len(parameter_values): 
       raise BoostPythonArgumentError 
      for parm_name, parm_value in zip(parameter_names, 
              parameter_values): 
       setattr(retval, parm_name, parm_value) 
    except BoostPythonArgumentError: 
     raise ValueError('Lots of helpful text here') 
    return retval 

Cela fonctionne pour beaucoup de cas. Boost.Python vérifie automatiquement le type de parm_value à l'heure définie. Malheureusement, cela ne fonctionne pas sur les chaînes contenant 'inf'. ast.literal_eval soulève ValueError('malformed string') quand je voudrais qu'il retourne un flotteur. Je ne comprends pas comment Python peut analyser 'inf', mais literal_eval ne le peut pas.

Répondre

0

Avez-vous besoin d'évaluer? par exemple.

a = "(1,2,3,4)" 
b = tuple(a.strip('()').split(',')) 
assert ('1','2','3','4') == b 
0

Si tous les éléments ont le même type numérique, cela fonctionne:

numpy.fromstring('1.3, 2.2, 5, inf, 2', sep=',') 

retours

array([ 1.3, 2.2, 5. , inf, 2. ]) 
Questions connexes