0

我在 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[]"))获取值

对不起,如果这些看起来很基本的问题,我是一个试图变得更好的初学者!

4

3 回答 3

2

如果leveloneAdd == ('english', 'subject')那么它不是一个元组列表,它只是一个元组,所以each在循环的每次迭代中都会将一个字符串作为一个值。

leveloneAdd == [('english', 'subject')]如果这是一个内部包含元组的列表,您的代码将可以正常工作。

如果可以的话,您最好的选择是修复代码,因此 leveloneAdd 始终是一个元组列表,如果您不能这样做,那么当它是一个包含两个字符串的元组时,您必须通过将 leveloneAdd 设为一个列表来修复它在里面。小心,测试所有输入,因为在处理这种转换时很容易出错。

文档中说get_all应该返回一个列表,也许它仅在有多个参数时才返回一个列表。如果是这种情况,如果它是字符串,您可以将值转换为列表:

if isinstance(leveloneAdd, basestring):
    leveloneAdd = [leveloneAdd]

之后,只需将 leveloneAdd 的值拆分为 ','

还要调整你的Javascript以避免额外的字符,如“(”和“'”

于 2013-01-14T20:05:54.887 回答
1

FC 说的是真的。

我对单元素与元组的问题有点困惑。如果基本问题只是检测您是否将简单值或元组作为 的元素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`
于 2013-01-14T20:31:30.363 回答
1

尝试这个:

for (tag, htype) in leveloneAdd:
    # stuff

如果它不是一个元组,你会得到类似“Too many values to unpack”的错误。


我误读了OP。

当我遇到这样的问题时,我通常会尝试这样的事情:

for thing in list:
    try:
        (tag, htype) = thing
    except:
        import pdb
        pdb.set_trace()

然后你会得到调试器,你可以看看'东西'是否是你认为的那样。


根据 OP,“事物”不是元组,而是 unicode 字符串。要解决您的问题,请转换为字符串,然后拆分字符串。代码如下:

thing = u'(a,b)'
[tag, htype] = str(thing).lstrip('(').rstrip(')').split(',')

这假设您总是期望两个条目的元组。

于 2013-01-14T19:03:29.563 回答