在Python 2.7上与None比较时如何抛出异常?

时间:2016-02-02 22:56:49

标签: python python-2.7

在Python 2.7中:

表达式1(罚款):

>>> 2 * None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

表达式2(罚款):

>>> None is None
True

表达式3(错误):

>>> 2 < None
False

表达式4(错误):

>>> None<None
False

表达式5(错误):

>>> None==None
True

我想以某种方式强制表达式3,4和5抛出TypeError(与表达式1中的相同)。

Python 3.4几乎就在那里 - 只有表达式5返回True。

我需要2.7。

我的用例(如果有兴趣的人):

我做了一个评估一些表达式的应用程序(例子):

d = a+b
e = int(a>b)
f = a if a<b else b if b<c else c

表达式基于来自反序列化json的值(a,b和c)。 大多数时间值(a,b和c)是整数,但有时(当缺少值时)它是None。当缺少值并在某些表达式中使用时,表达式应该返回None(我正在考虑捕获TypeError异常)。

如果a = None,b = 1,c = 2,则检测结果为:d =无,e =无,f =无。

如果a = 1,b = 2,c = None,预期结果为:d = 3,e = 0,f = 1

2 个答案:

答案 0 :(得分:1)

您无法更改None的行为。但是,您可以实现具有所需行为的自己的类型。作为一个起点:

class CalcNum(object):
    def __init__(self, value):
        self.value = value

    def __add__(self, o):
        return CalcNum(self.value + o.value)

    def __lt__(self, o):
        if self.value is None or o.value is None:
            # Pick one:
            # return CalcNum(None)
            raise TypeError("Can't compare Nones")

        return CalcNum(self.value < o.value)

答案 1 :(得分:0)

您可以使用issinstance:

from numbers import Number


def pre(a, b, c):
    if not isinstance(a, Number) or not isinstance(b, Number):
        return None, None, None
    if not isinstance(c, Number):
        return a + b, a > b, a if a < b else b
    return a + b, a > b,  a if a < b else b if b < c else c

如果计算中的任何数字为无,则返回所有Nones,如果c为None,则返回计算,不包括if b&lt; c else c,如果它们都是数字,则返回所有表达式:

In [53]: pre(None,1,2)
Out[53]: (None, None, None)

In [54]: pre(1,2,None)
Out[54]: (3, False, 1)

In [55]: pre(None,None,None)
Out[55]: (None, None, None)

In [56]: pre(3,4,5)
Out[56]: (7, False, 3)