我在python GAE工作。
无法弄清楚为什么我无法使用[index]
从我的元组中提取值。从日志中,我可以看到我的leveloneAdd
变量中有值,例如('english'
,'subject'
) - 但是当我循环播放1的元组时,我的变量tag
和htype
中的空洞变得空洞 - 当我'我期待tag = 'english'
和htype = 'subject'
。
有人有任何想法吗?
for each in leveloneAdd:
tag = each[0]
htype = each[1]
q1 = Level_1_Headings.all().filter("name1 =",tag).filter("heading_type =",htype).get()
所以我按照Martijn的建议在日志中做了repr,这是我的日志: 感谢您的输入!喜欢这个板子 - 这是我的日志,使用Martijn的建议---我认为它正在解释整个事情就像一个字符串---
INFO 2013-01-14 19:28:17,030 main.py:291] each is ('math', 'subject')
INFO 2013-01-14 19:28:17,030 main.py:292] u"('math', 'subject')"
INFO 2013-01-14 19:28:17,030 main.py:294] tag is (
INFO 2013-01-14 19:28:17,030 main.py:296] heading type is '
看起来字符串被视为字符串?如何将其转换为读取作为真正的元组。这是我的原始代码,其中应该创建元组(然后它将转到客户端,然后返回到日志中显示的那个。)
对于h1中的x: listone.append((STR(x.name1),STR(x.heading_type)))
上述值位于输入选择下拉框表单中
然后从服务器端python - 我得到的值由
leveloneAdd =(self.request.get_all(“list_uno []”))
对不起,如果这些似乎是基本的问题,我是一个初学者,试图变得更好!!
答案 0 :(得分:2)
如果leveloneAdd == ('english', 'subject')
那么它不是元组列表,它只是一个元组,所以在循环的每次迭代中each
将字符串作为值。
如果leveloneAdd == [('english', 'subject')]
是一个里面有元组的列表,那么你的代码可以正常工作。
你最好的选择,如果可以的话,就是修复代码,这样leveloneAdd总是一个元组列表,如果你不能这样做那么你必须通过使levelone添加一个列表来修复它,当它是一个元组时里面有两个字符串。请小心,测试所有输入,因为在处理这种转换时很容易出错。
在docs中说get_all
应该返回一个列表,也许它只在有多个参数时返回一个列表。如果是这种情况,您可以将值转换为列表,如果它是一个字符串:
if isinstance(leveloneAdd, basestring):
leveloneAdd = [leveloneAdd]
之后只需将leveloneAdd的值与','
分开同时调整您的Javascript以避免额外的字符,例如“(”和“'”
答案 1 :(得分:1)
试试这个:
for (tag, htype) in leveloneAdd:
# stuff
如果它不是一个元组,你会得到类似“解压缩的值太多”的错误。
我误读了OP。
当我遇到这样的问题时,我通常会尝试这样的事情:
for thing in list:
try:
(tag, htype) = thing
except:
import pdb
pdb.set_trace()
然后你将获得调试器,你可以看到'thing'是否符合您的想法。
根据OP,'thing'不是元组,而是unicode字符串。要解决您的问题,请转换为字符串,然后拆分字符串。代码如下:
thing = u'(a,b)'
[tag, htype] = str(thing).lstrip('(').rstrip(')').split(',')
这假设你总是期待两个条目的元组。
答案 2 :(得分:1)
F.C.说的是真的。
我对单元素与元组问题有点困惑。如果基本问题只是检测你是否有leveloneAdd
元素的简单值或元组,也许你会考虑将listoneAdd
作为元组列表,即使你添加的是一个元素单个元素。这样,当您从列表中提取元素时,您将始终知道可以将其编入索引:
listoneAdd = [('one',), ('foot',), ('three', 'pigs')]
for element in listoneAdd:
print "element is " + str(element)
for i in range(0,len(element)):
print " do something with value " + element[i]`
得到以下特性:
element is ('one',)
do something with value one
element is ('foot',)
do something with value foot
element is ('three', 'pigs')
do something with value three
do something with value pigs`