如何在Python中将元组转换为字符串及反向操作 / 如何编辑网页上的关联数组
我真正想解决的问题:
我有一个方形的表格,里面是一些真或假的值,行和列用字符串来标记。
我想把这个表格显示成一个网页表单,里面有复选框,让用户可以勾选或取消勾选,然后提交表单,最后我想从这个表单中重新构建出原来的数组。
我现在想解决的一个小问题:
我有一个包含两个字符串的元组,("foo", "bar")。
我想把这个元组变成网页中复选框的名字。
然后当表单提交后,我想把这个字符串再变回原来的元组。
目前我在做的是,用 ("%s$%s" % ("foo", "bar")) 变成 "foo$bar",然后用 string.split('$') 来把字符串分开,这样可以得到原来的字符串,虽然这样可以用,但感觉有点不靠谱,如果字符串里出现了美元符号就会出问题。
显然,我不能直接用 repr 和 eval!
有没有一种合理、标准的方法来做到这一点呢?
3 个回答
为什么不直接把结构嵌套起来呢?既然需要一个包含值和描述的矩阵,为什么不这样嵌套呢:
matrix = [
[{'value': False, 'string':'str1'}, {'value': False, 'string':'str2'}],
[{'value': False, 'string':'str1'}, {'value': False, 'string':'str2'}],
]
现在,matrix[0][0]
就代表一个字典,里面有 string
和 value
这两个键。这样的话,你可以很轻松地把它转换成一个 HTML 表格。
另外,如果你不需要修改的话,也可以使用嵌套的元组。
不过,比较麻烦的是重建数据。你需要仔细构建 name
标签;我建议根据你用来导航矩阵的索引来做,像这样:
print "<table>"
for i in range(0, 2):
print "<tr>"
for j in range(0, 2):
print "<td>"
item = '<input name="matrix-%d-%d" value=%s>%s<br/>' % (i,j,
str(matrix[i][j]["value"]), matrix[i][j]["string"])
print item
print "</td">
print "</tr>"
print "</table>"
接下来,你的任务就是从提交的值中重新创建这个列表,基本上就是把字符串分开,检查一下边界是否合理(是否在预期范围内),然后填充字典的值。
你的第二个问题是没法解决的,因为这需要在服务器上记住一些状态。客户端总是被视为不安全的。没有任何合理的方法能让你收到和发送的字符串完全一样。用户总是有办法进行一些黑客攻击。
除非你想用加密的方法来处理这个问题,但我对此表示怀疑 :)
不过,如果你不担心一些小黑客会破坏你的应用,其实有很多方法可以做到,比如你已经做的那样,或者在一个隐藏的字段里保存第一个字符串的长度,这样就可以把剩下的部分留给第二个字符串。或者把字符串分开存储在两个不同的字段里等等。
看起来,使用json是比较常见的方式,而且它是Python自带的功能。
首先,我们需要导入json模块:
import json
接着,我们可以把一个元组(类似于列表)转换成json格式:
json.dumps(("hi","there"))
这会输出:'["hi", "there"]'
然后,我们可以把这个json格式的数据再转换回Python的列表:
json.loads('["hi", "there"]')
结果是:[u'hi', u'there']
如果我们把一个包含特殊字符的元组转换成json格式,再转换回来:
json.loads(json.dumps(("hi","th'ere",'the"e$re')))
得到的结果是:[u'hi', u"th'ere", u'the"e$re']