Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python2.7上与无进行比较时如何引发异常?_Python_Python 2.7 - Fatal编程技术网

在Python2.7上与无进行比较时如何引发异常?

在Python2.7上与无进行比较时如何引发异常?,python,python-2.7,Python,Python 2.7,在Python 2.7中: 表达式1(罚款): 表达式3(不好): 我想以某种方式强制表达式3、4和5抛出TypeError(与表达式1相同) Python3.4就快到了——只有表达式5返回True 我需要它在2.7 我的用例(如果有人感兴趣): 我制作了一个计算某些表达式的应用程序(示例): d=a+b e=int(a>b) 如果a无法更改None的行为,则f=a。但是,您可以实现自己的类型,该类型具有您想要的行为。作为起点: class CalcNum(object): def _

在Python 2.7中:

表达式1(罚款):

表达式3(不好):

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

Python3.4就快到了——只有表达式5返回True

我需要它在2.7


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

我制作了一个计算某些表达式的应用程序(示例):

d=a+b
e=int(a>b)

如果a无法更改
None
的行为,则f=a。但是,您可以实现自己的类型,该类型具有您想要的行为。作为起点:

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)
class CalcNum(对象):
定义初始值(自身,值):
自我价值=价值
定义添加(自我,o):
返回值(自身值+o值)
定义(自我,o):
如果self.value为None或o.value为None:
#选择一个:
#返回值(无)
raise TypeError(“无法比较Nones”)
返回值(自身值
您可以使用iInstance:

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

简单回答:你不能。您无法更改标准类的神奇方法,因此,除非您对不同的语法(例如
compare(thing1,thing2)
),实现您自己的类以供使用(如建议的那样),或者实际修补Python本身,否则您就不走运了。在问题中陈述您的用例做得很好!巧妙地避免了。为什么不使用一个简单的try/except呢?帕达里克·坎宁安:问题是:(2a+b
相当于
a.\uuuuuuuuuuuuuuu(b)
-每个类(包括
int
)本身实现加法。您确实需要用CalcNum替换所有实例。您可以通过实现
def\uuu float\uuuu(self):返回float(self.value)
使
math.sin(CalcNum(a))
工作,但最好的选择可能是实现自己的表达式解析器(或者自己使用并评估它们,决定如何处理每一个,而不是依赖Python的
eval
。在
CalcNum
中实现
\uuuu float\uuuu
可能是一个好主意。
编译器。parse
听起来也很有希望。我会尝试一下。
>>> 2 < None
False
>>> None<None
False
>>> None==None
True
d = a+b
e = int(a>b)
f = a if a<b else b if b<c else c
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)
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
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)