2011-11-09 8 views
1

私は説明できない非常に奇妙なバグがあります。これは私がpythonとsqliteを組み合わせたときに発生します。私は、stop_latという名前のREALフィールドを含むテーブルを持っています。私は次の出力私は私は次の出力を得るfloat、ints、sqliteを含む奇妙なpythonの動作

c = conn.cursor() 
c.execute("select stop_lat from stops;") 
for (stop_lat,) in c: 
    print stop_lat 
    print type(stop_lat) 
    #stop_lat = int(stop_lat*1000) 

を実行する意味、最後の行をコメントアウト今

stop_lat 
<type 'unicode'> 
Traceback (most recent call last): 
    File "./extract_data_tools/extract_trips.py", line 47, in <module> 
    stop_lat = int(stop_lat*1000) 
ValueError: invalid literal for int() with base 10: 'stop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_latstop_lat' 

に取得

c = conn.cursor() 
c.execute("select stop_lat from stops;") 
for (stop_lat,) in c: 
    print stop_lat 
    print type(stop_lat) 
    stop_lat = int(stop_lat*1000) 

:私は、次のコードを実行すると、 :

37.743804 
<type 'float'> 
37.780889 
<type 'float'> 
37.772006 
<type 'float'> 
37.723433 
<type 'float'> 
37.783026 
<type 'float'> 
... 

stop_latのタイプは、私がintに渡すかどうかによって決まります...実際には私には意味がありません。それは見知らぬ人にもなります。次のコード

c = conn.cursor() 
c.execute("select stop_lat from stops;") 
for (stop_lat,) in c: 
    print stop_lat 
    print type(stop_lat) 
    stop_lat = stop_lat*1000 
    print stop_lat 
    print type(stop_lat) 

出力

37.780889 
<type 'float'> 
37780.889 
<type 'float'> 
37.772006 
<type 'float'> 
37772.006 
<type 'float'> 
37.723433 
<type 'float'> 
37723.433 
<type 'float'> 
37.783026 
<type 'float'> 
37783.026 
<type 'float'> 
... 

誰もがここで何が起こっているか私に説明できますか?私はsqliteがゲーム内になければ問題を再現することができません(つまりコードリテラルは期待どおりに動作します)。

+0

エラーを再現する最小限のスクリプトを作成できますか?インメモリー・データベースを使用して自己完結型にすることができます。 –

+0

私はバグを見つけました... sqliteはcsvデータを読み込むときにducktypesを意味する実際の制約を強制しません。最初の行の列の名前を使用して、どのデータをどの列に移動するかを判断する代わりに、列名に「stop_lat」という列を含む表に行を挿入します。 Pythonもダックタイプのため、Pythonコードにエラーが伝播するので、無効な行エントリが1つしかないので、デバッグ出力を見るときにキャッチしませんでした。 ダックタイピングが嫌です! –

+0

あなたはそれを回答として投稿し、それを受け入れることができます(自分の質問に答えることはOKです)。副メモとして、あなたは[このページ](http://sscce.org)を読むべきです。最小限のサンプルを作成することはデバッグに非常に便利で、すべての関連情報が質問に含まれていることを確認することもできます。 –

答えて

2

コメントアウトされた行がそれ以上変更されているように見えます。

最初のSQL文は、実行中であると表示されます。select "stop_lat" from stopsと、別のSQL文が引用符なしで実行されています(select stop_lat from stops)。

+0

確かに。これはまた、いくつかのカスタム型(または 'float'クラスをオーバーライドしていますか?)によっても引き起こされているかもしれませんが、この場合はちょっと変わったようです。 – Tadeck