使用变量时键入错误

时间:2013-07-18 20:40:49

标签: python

所以我有这行代码:

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。

不支持的操作数类型

4 个答案:

答案 0 :(得分:3)

显然,fc_no_rocks是一个字符串。那个错误在你身上。最好检查几个案例:

  1. fc_no_rocks是一个数字
  2. fc_no_rocks是一个表示数字的字符串
  3. fc_no_rocks既不是上述
  4. 您检查以确保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
    

    您可以滥用布尔or运算符的行为以及write()方法始终返回None的事实!万岁!如果你想看到它的表示,你也可以写repr(fc_no_rocks) - 对于获取字符串的内容和指示是有用的,它是一个字符串。

    编辑:我正在运行Python 2.7.2,所以我必须添加小数点才能正确划分。 Woops!

答案 1 :(得分:1)

为什么不确保fc_no_rocks是浮点数?

fc = round((1+5*100)/100, 3) if fc_no_rocks == None else round(float(fc_no_rocks)/100, 3)

答案 2 :(得分:1)

有一个for循环更改了变量,因此fc_no_rocks设置为None。这在将fc变量开关设置到左侧时产生了逻辑,其中我替换的其中一个变量也是一个字符串。抱歉混淆

答案 3 :(得分:0)

还有一件事。 round((1+5*100)/100, 3)没有什么可以舍入,因为数字文字都是整数,包含除法的整数等式(1+5*100)/100的结果是 5 ,而不是 5.01 < / strong>正如您所料。要修复它,你必须在每个十进制计算中使用所有十进制文字:

round((1.0+5.0*100.0)/100.0, 3)

编辑:修复后的语句会产生5.01,所以你应该小心代码的其他部分。