2012-07-13 47 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

相关问题