【问题标题】:decorating ConfigParser.get() with ast.literate_eval or eval用 ast.literate_eval 或 eval 装饰 ConfigParser.get()
【发布时间】:2015-05-22 01:12:07
【问题描述】:

我想自动评估/猜测您可以通过 configparser 从 ini 文件中获取的数据的数据类型。

免责声明:我确实知道这种事情的安全问题,但是,我相信这些文件,而且,无论如何,我很想了解为什么以下代码不起作用。

import configparser
import ast
sample=u"""
[General]
t=300.
[Section]
t=${General:t}
"""
def decorator(func):
    def wrapper(*args,**kwargs):
        try:
            return eval(func(*args,**kwargs))
        except Exception as e:
            print 'Warning'
            return func(*args,**kwargs)
    return wrapper    
parser=configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
parser.get=decorator(parser.get)
parser.read_string(sample)
parser.get('Section','t')

加注:

TypeError: argument of type 'float' is not iterable

对解决方法有任何想法/建议吗?

【问题讨论】:

    标签: python-2.7 eval decorator ini


    【解决方案1】:

    嗯,eval 会解析提供的文字表达式并返回一个评估结果,它绝不会帮助您确定数据类型,除非您打算对评估的输出进行额外的操作。

    话虽如此,我可以说你有一个有趣的问题,最简单的解决方法是更改​​ t=300。到 t='300'。 ,那应该解决异常。其他方法是将 eval 部分移出装饰器

    1)

    #  USE QUOTES in to be parsed string 
    import configparser
    import ast
    sample = u"""
             [General]
             t='300.0'   # NOTICE QUOTES
             [Section]
             t=${General:t}
            """
    
    def decorator(func):
        def wrapper(*args, **kwargs):
    
            try:
                return eval(func(*args, **kwargs))
            except Exception as e:
                print 'Warning'
                return func(*args, **kwargs)
        return wrapper
    parser = configparser.ConfigParser(
              interpolation=configparser.ExtendedInterpolation()
    )
    parser.get = decorator(parser.get)
    parser.read_string(sample)
    parser.get('Section', 't')
    

    2)

    #  EVAL outside decorator 
    import configparser
    import ast
    sample = u"""
             [General]
             t=300.0     #  NO QUOTES
             [Section]
             t=${General:t}
            """
    
    def decorator(func):
        def wrapper(*args, **kwargs):
    
            try:
                func(*args, **kwargs)
    
        return wrapper
    parser = configparser.ConfigParser(
              interpolation=configparser.ExtendedInterpolation()
    )
    parser.get = decorator(parser.get)
    parser.read_string(sample)
    eval(parser.get('Section', 't'))
    

    使用第二种方法与删除整个装饰器部分并直接使用parser.get一样好(总之它没有增加任何价值)。

    我仍然想知道为什么装饰器中的 eval 会引发异常。

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 2021-07-21
      • 1970-01-01
      • 2020-01-11
      • 2014-11-05
      • 1970-01-01
      • 2013-05-07
      • 2014-01-14
      • 2015-02-01
      相关资源
      最近更新 更多