0

私はPythonGAEで作業しています。

を使用してタプルから値を抽出できない理由がわかりません[index]leveloneAddログから、変数に値があることがわかります。たとえば、( 'english''subject')-しかし、1のタプルをループしているときは、変数が空になりtaghtype-期待しているときは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が常にタプルのリストになるようにコードを修正するのが最善のオプションです。それができない場合は、2つの文字列を持つタプルの場合に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

タプルでない場合は、「解凍するには値が多すぎます」などのエラーが発生します。


OPを読み間違えました。

私がこのような問題に遭遇したとき、私は通常次のようなことを試みます:

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

次に、デバッガーを取得し、「もの」が自分の考えているものであるかどうかを確認できます。


OPによると、「thing」はタプルではなく、Unicode文字列です。問題を解決するには、文字列にキャストしてから、文字列を分割します。コードは次のとおりです。

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

これは、常に2つのエントリのタプルを期待していることを前提としています。

于 2013-01-14T19:03:29.563 に答える