Python意外的int(0或...)行为

时间:2015-01-29 23:07:02

标签: python

编辑:对于使用逻辑运算符将其标记为重复的人,我发现链接Python Logical Operators和那里的答案相当模糊,在找到"或&#34之前必须深入研究它;回答。 所以虽然这里的问题是Python抛出None,False和0一起,很好,但是在这里我们要区分前两个和实际的整数或浮点值。除了解释一些基本行为并且没有解决问题之外,那篇文章对我的问题没有任何帮助。我们怎样才能以最pythonic的方式处理这个特定的情况"。 //

我使用int(...或...)转换整数时遇到了一些意想不到的行为。我之前没有注意到,因为我经常使用类似的东西:

int(value or 0)

总是工作正常,但当我将0或0更改为另一个值并输入0时,我得到了一些我没想到的东西。示例是int,但float也是如此。

In [88]: int(None or 1)
Out[88]: 1

In [89]: int(2 or 1)
Out[89]: 2

In [90]: int(0 or 1)
Out[90]: 1

In [91]: int(0)
Out[91]: 0

编辑:我希望[90]和[91]一样,但显然它不会。我的问题是:为什么会这样做,我怎样才能以Pythonic的方式处理这个问题,而不必去尝试排除。

这是因为它的评估方式类似于布尔值而0因此返回或者值? 处理这个问题的常见做法是什么?因为这是我们程序中非常常见的事情并且使用try除了会创建一些丑陋的,不太可读的代码... 在这里使用python 2.7。

这是我当前的解决方法,以达到我预期的行为:

try:
    value = int(value)
except (TypeError, ValueError) as e:
    value = 1

亲切的问候,

岩溶

编辑2:由于现在基础机制已经很清楚了,我真正想要的帮助就是如何处理这种情况。正如评论中所述,我主要是这样做来处理Nones。另一种处理方法是:

if value is None:
    value = 1
else:
    value = int(value)

我真正想要理解的是,如何以不会将代码转换为if / else语句的无限游行的方式处理Nones,或者编写我自己的函数来执行它(因为对我而言)处理似乎应该是常见的事情?)。

1 个答案:

答案 0 :(得分:4)

我阅读你的问题的方式,你正在寻找最狡猾的方式来处理未能成功转换为int()的类型。

对我而言,我通常会在您的问题中完全捕捉到异常。它可能会有点冗长/重复,所以如果你做了很多,你总是可以使用实用程序类型转换功能来抽象你的try / catch块。例如:

def safely_int(value, default=0):
    try:
        return int(value)
    except (TypeError, ValueError):
        return default

这可以很好地捕捉所有奇怪/意外情况(一般来说,类型/值无法转换为整数)。

我知道你说你不想使用异常处理,但老实说我认为这是最好的解决方案,因为它会抓住你不期待的案例。除非您小心谨慎,否则输入代码意外输入是获取错误/意外行为的好方法。