所以我有这行代码:
fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(fc_no_rocks/100, 3)
接受一个变量,其类型应该是float。当我使用 type() 测试变量类型时,它返回:
>>>type(fc_no_rocks)
<type 'float'>
但我不断收到错误消息“不支持/: str 和 int 的操作数类型。
最佳答案
显然,fc_no_rocks
在您的案例中是一个字符串。那个错误在你身上。最好检查几种情况:
fc_no_rocks
是一个数字fc_no_rocks
是一个表示数字的字符串fc_no_rocks
两者都不是
您检查以确保fc_no_rocks
不是None
,但它可以是任何。因此,最好先进行更多的排他性检查,然后让你的 else
情况成为包罗万象的情况,即以上都不是/都不是。
在一团乱七八糟的三元链中,是这样的:
fc = round(float(fc_no_rocks)/100.0, 3) if isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3)
最好写成多行,imo,但是一行写起来很有趣。这就像在您知道其他人将要穿过的门上放一桶水。成为维护您代码的人真是太糟糕了……! (顺便说一句,确保你在写完这类东西后辞职,这样你就不必成为维护它的人。)
无论如何,输出:
>>> fc_no_rocks = "2.3"
>>> fc = ...
>>> fc
0.023
>>> fc_no_rocks = "foobar"
>>> fc = ...
>>> fc
5.01
>>> fc_no_rocks = 1.3
>>> fc = ...
>>> fc
0.013
>>> fc_no_rocks = 6340
>>> fc = ...
>>> fc
63.4
如果您想在该语句的中间进行调试,我有个好消息:
>>> import sys
>>> fc_no_rocks = "foobar"
>>> fc = round(float(fc_no_rocks)/100.0, 3) if sys.stdout.write(str(type(fc_no_rocks))+"\n") or isinstance(fc_no_rocks, str) and unicode(fc_no_rocks.replace('.','',1)).isnumeric() else round(fc_no_rocks/100.0, 3) if isinstance(fc_no_rocks, float) or isinstance(fc_no_rocks, int) else round((1+5*100)/100.0, 3)
<type 'str'>
>>> fc
5.01
您可以滥用 bool 值 or
运算符的行为以及 write()
方法始终返回 None
的事实!万岁!如果您想查看它的表示形式,您也可以编写 repr(fc_no_rocks)
- 对于获取字符串的内容和表明它是一个字符串的指示很有用。
编辑:我运行的是 Python 2.7.2,所以我必须添加小数点才能正确除法。糟糕!
关于python - 使用变量时输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733478/