代码之家  ›  专栏  ›  技术社区  ›  shahjapan

用于eval的python字符串转换

  •  0
  • shahjapan  · 技术社区  · 14 年前

    我有如下清单:

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

    还有一个字符串表达式

    exp = 'qty * price - discount + 100'
    

    我想把这个表达式转换成

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

    就像我想评估这个表达式一样 eval(exp or False, dict(obj=my_obj))

    我的问题是,生成python eval求值表达式的最佳方法是什么。。。。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    8 年前

    当然你必须是 very careful 使用eval。我很想知道你为什么要用eval来做这个

    import re
    exp = 'qty * price - discount + 100'
    exp = re.sub('(qty|price|discount)','%(\\1)f', exp)%vars(obj)
    
        2
  •  1
  •   Ihor Kaharlichenko    14 年前

    我假设您拥有的列表是可用obj属性的列表。

    如果是这样,我建议使用正则表达式,如下所示:

    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)
    
        3
  •  1
  •   Andrew    14 年前

    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))
    

    输出:

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