在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
答案 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)