python表示负无穷_在python中为任何对象创建无穷大和负无穷大

本文探讨了如何在Python中处理无限大值,特别是在与DateTime对象比较时遇到的问题。作者创建了Infinity和NegativeInfinity类来代表无穷大和负无穷大,并实现了比较方法。然而,直接与DateTime对象比较会导致TypeError。为解决此问题,文章提出添加一个timetuple方法到Infinity类,使DateTime对象能够正确比较。这种方法成功地允许了Infinity对象与DateTime对象之间的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在研究一个库,它实现了一个数据结构,可以处理任何有序的数据类型——范围集。当你允许正无穷大和负无穷大时,很多操作(比如反转)变得有趣起来。

一个目标是让DATEIME对象与这个模块一起工作,并且在用非数字对象支持无穷大时,我已经创建了无穷大和负无穷大:class _Indeterminate(object):

def __eq__(self, other):

return other is self

@functools.total_ordering

class _Infinity(_Indeterminate):

def __lt__(self, other):

return False

def __gt__(self, other):

return True

def __str__(self):

return 'inf'

__repr__ = __str__

@functools.total_ordering

class _NegativeInfinity(_Indeterminate):

def __lt__(self, other):

return True

def __gt__(self, other):

return False

def __str__(self):

return '-inf'

INFINITY = _Infinity()

NEGATIVE_INFINITY = _NegativeInfinity()

不幸的是,当在CMP-()操作的左侧时,这对DATETIME对象不起作用:

In [1]: from rangeset import *

In [2]: from datetime import datetime

In [3]: now = datetime.now()

In [4]: cmp(INFINITY, now)

Out[4]: 1

In [5]: cmp(now, INFINITY)

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

/home/axiak/Documents/rangeset/ in ()

----> 1 cmp(now, INFINITY)

TypeError: can't compare datetime.datetime to _Infinity

我希望我能通过使用一个CMP包装器来绕过这个限制,它只是确保了我的对象总是被调用,但是我真的想使用.sort()方法,它会在这些对象之间调用CMP。

有没有办法创造一个比任何其他物体都小,比任何其他物体都大的物体?

模块主页:https://github.com/axiak/py-rangeset

最佳答案:

从docs

为了防止比较回到

比较对象地址时,日期比较通常会引发类型错误

如果另一个比较项不是日期对象。然而,

如果另一个比较对象具有

timetuple()属性。

因此,为了允许与datetime对象进行比较,添加一个timetuple方法,例如class _Infinity(object):

def __lt__(self, other):

return False

def __gt__(self, other):

return True

def timetuple(self):

return tuple()

import datetime

INF = _Infinity()

now = datetime.datetime.now()

print cmp(INF, now)

print cmp(now, INF)

输出:

1

-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值