Python将字符串转换为元组以用于REST API
我正在尝试使用django-piston构建一个REST API,在这个库里,我可以通过元组来指定要显示的字段。
fields = ('id', 'title', ('author', 'username',),)
因此,我想让开发者通过GET请求来指定数据格式,比如:
http://localhost/api/users?attr=(id,title,(author,username,),)
我看到可以用eval()把字符串转换成元组。不过,我遇到了两个问题。
- 有没有简单的方法可以给参数名加上引号,让它变成"('id','title', ('author','username'))"?
- 使用eval安全吗?我看到可以通过这个方法来移除内置函数:eval("('id','title',('author','username',),)", {'_builtins_':[]}, {})
为了让大家了解我为什么要让开发者指定数据集,我是根据LinkedIn的建议来构建REST API的。
非常感谢任何帮助。
祝好,
Mickey
2 个回答
1
我会直接用普通的字符串处理方法来解析内容,随便用你觉得合适的语法。在我看来,把自己内部的工作原理暴露出来是非常不酷的。
1
你没有说明你使用的是哪个版本的Python,不过这里有一个在Python 2.6中有效的解决方案,而且它不使用eval这个功能。
import ast
def parse_params(s):
root = ast.parse(s)
expr = root.body[0]
return process_node(expr.value)
def process_node(node):
if isinstance(node, ast.Tuple):
return tuple(map(process_node, node.elts))
elif isinstance(node, ast.Name):
return node.id
else:
raise ValueError("unsupported node type %r" % node)
>>> parse_params('(id,title,(author,username,),)')
('id', 'title', ('author', 'username'))