Python将字符串转换为元组以用于REST API

0 投票
2 回答
625 浏览
提问于 2025-04-16 11:16

我正在尝试使用django-piston构建一个REST API,在这个库里,我可以通过元组来指定要显示的字段。

fields = ('id', 'title', ('author', 'username',),)

因此,我想让开发者通过GET请求来指定数据格式,比如:

http://localhost/api/users?attr=(id,title,(author,username,),)

我看到可以用eval()把字符串转换成元组。不过,我遇到了两个问题。

  1. 有没有简单的方法可以给参数名加上引号,让它变成"('id','title', ('author','username'))"?
  2. 使用eval安全吗?我看到可以通过这个方法来移除内置函数:eval("('id','title',('author','username',),)", {'_builtins_':[]}, {})

为了让大家了解我为什么要让开发者指定数据集,我是根据LinkedIn的建议来构建REST API的。

这是链接: http://blog.linkedin.com/2009/07/08/brandon-duncan-java-one-building-consistent-restful-apis-in-a-high-performance-environment/

非常感谢任何帮助。

祝好,
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'))

撰写回答