我想自动评估/猜测您可以通过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对解决方法有什么想法/建议吗?
发布于 2015-05-22 14:11:22
虽然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会抛出异常。
https://stackoverflow.com/questions/30386847
复制相似问题