2010-08-19 9 views
0

Je liste comme:conversion de chaîne de python pour eval

['name','country_id', 'price','rate','discount', 'qty'] 

et une expression de chaîne comme

exp = 'qty * price - discount + 100' 

Je veux convertir cette expression en

exp = 'obj.qty * obj.price - obj.discount + 100' 

que je veux eval cette expression comme eval(exp or False, dict(obj=my_obj))

ma question est quelle serait la meilleure façon de générer l'expression d'évaluation eval python ....

+1

où vient exp venir? –

+0

entrée de l'utilisateur, son être utilisé de manière dynamique, où l'utilisateur a besoin de changer leurs expressions – shahjapan

Répondre

2

Bien sûr, vous devez être very careful en utilisant eval. Ce serait intéressant de savoir pourquoi vous avez besoin d'utiliser eval pour du tout

De cette façon, il est plus difficile pour quelque chose de mal à se produire si un utilisateur malveillant trouve un moyen de mettre les données non numériques dans les champs

import re 
exp = 'qty * price - discount + 100' 
exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj) 
+0

Je peux utiliser eval littérale aussi, mais l'expression est entrée dynamiquement par l'utilisateur final! – shahjapan

+0

@shahjapan: Utilisez 'literal_eval' - c'est ce qu'il vous faut! – katrielalex

1

Je suppose que la liste que vous avez est la liste des propriétés obj disponibles.

Si c'est le cas, je vous suggère d'utiliser des expressions régulières, comme ceci:

import re 

properties = ['name', 'country_id', 'price', 'rate', 'discount', 'qty'] 
prefix = 'obj' 
exp = 'qty * price - discount + 100' 

r = re.compile('(' + '|'.join(properties) + ')') 
new_exp = r.sub(prefix + r'.\1', exp) 
1

La façon la plus simple serait de boucle à travers chacun de vos variables potentielles et remplacer toutes les occurrences d'entre eux dans le chaîne cible.

keys = ['name','country_id', 'price','rate','discount', 'qty'] 
exp = 'qty * price - discount + 100' 

for key in keys: 
    exp = exp.replace(key, '%s.%s' % ('your_object', key)) 

Sortie:

'your_object.qty * your_object.price - your_object.discount + 100' 
+0

Il a échoué lorsque j'ai des clés comme list_price, price, standard_price ..... :) – shahjapan