2012-07-13 71 views
1

我有(匿名)在Python 2.6.8從值組成的哈希:爲什麼float('3')顯然返回Python 2.6.8中的TypeError?

sys.stderr.write('#' + str(dictionary['Field 4']) + '#\n') 
kpis_found.append(float(int(dictionary['Field 1']), 1) * 
    max(float(dictionary['Field 2']), 1) * 
    max(float(dictionary['Field 3']), 1) * 
    max(float(dictionary['Field 4']), 1) * 
    max(float(dictionary['Field 5']), 1)) 

我得到的輸出是:

[Fri Jul 13 09:04:44 2012] [error] [client ::1] #3# 
[Fri Jul 13 09:04:44 2012] [error] [client ::1] Traceback (most recent call last): 
[Fri Jul 13 09:04:44 2012] [error] [client ::1] File "/Users/jonathan/mirror/civic/google_maps/index.cgi", line 357, in <module> 
[Fri Jul 13 09:04:44 2012] [error] [client ::1]  max(float(dictionary['Field 4']), 1) * 
[Fri Jul 13 09:04:44 2012] [error] [client ::1] TypeError: float() takes at most 1 argument (2 given) 

據我所知,CSV文件生成(通常)可轉換爲整數的字符串,或(偶爾)可轉換爲浮動的字符串。如果我遇到NULL,那應該更容易診斷。調試輸出似乎確認該字段是'3'。

這是如何得到TypeError?我已經通過括號運行,以確保我沒有計算

max(float(foo, bar)) 

而是計算

max(float(foo), bar) 

任何有識之士將受到歡迎。

+4

這裏的令人困惑的事情就是,Python定位在多行語句中的最後一行的錯誤,而它實際上是在第一線。 – 2012-07-13 14:19:55

+0

@SvenMarnach沒有意識到這是原因,但很有趣。爲什麼它不是被標記的多行語句的第一行? – JAB 2012-07-13 14:44:22

+0

@JAB:在CPython中,每個簡單的語句只會在代碼對象的行號表中產生一行,而選擇的行號是多行語句的最後一行。一般來說,這樣做會很棘手,所以編譯器不會感到困擾。 (另見http://hg.python.org/cpython/file/93df82c18781/Objects/lnotab_notes.txt) – 2012-07-13 15:00:34

回答

7
float(int(dictionary['Field 1']), 1) 

很確定這是你的問題。你最終與float(<int_value>, 1)

這是與Python 3.1.2測試,但...

>>> float(1, 1) 
Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    float(1, 1) 
TypeError: float() takes at most 1 argument (2 given) 
+0

你的回答是正確的,但回溯顯示不同的行(在我的回答中懷疑的原因) – 2012-07-13 14:19:42

+2

@OttoAllmendinger:這就是Python爲多行語句所做的工作。這有點令人困惑。 – 2012-07-13 14:21:15

+0

Upvoted並將在SO允許時接受。謝謝;我想知道爲什麼堆棧跟蹤顯示錯誤的行。 – JonathanHayward 2012-07-13 14:21:33

相關問題