首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ast.literate_eval或eval修饰ConfigParser.get()

使用ast.literate_eval或eval修饰ConfigParser.get()
EN

Stack Overflow用户
提问于 2015-05-22 09:12:08
回答 1查看 153关注 0票数 0

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

免责声明:我确实知道这种事情的安全性问题,但是,我信任这些文件,而且,无论如何,我很有兴趣理解为什么下面的代码不能工作。

代码语言:javascript
运行
复制
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')

加薪:

代码语言:javascript
运行
复制
TypeError: argument of type 'float' is not iterable

对解决方法有什么想法/建议吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-22 14:11:22

虽然eval会解析提供的文字表达式并返回求值结果,但它并不能帮助您确定数据类型,除非您打算对求值输出进行额外的操作。

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

1)

代码语言:javascript
运行
复制
#  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)

代码语言:javascript
运行
复制
#  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会抛出异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30386847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档