如何使一个整数比任何其他整数都大?

2024-06-06 16:55:21 发布

您现在位置:Python中文网/ 问答频道 /正文

注意:虽然接受的答案达到了我想要的结果,@ecatmur answer提供了一个更全面的选项,但我觉得首先强调我的用例是一个坏主意是非常重要的。这在@Jason Orendorff answer below中解释得很好。

注意:这个问题不是the question about ^{}的副本。它与sys.maxint无关;即使在有sys.maxint可用的python 2中,它也不表示最大整数(请参阅接受的答案)。

我需要创建一个比任何其他整数都大的整数,这意味着与使用>的任何其他int对象相比,返回Trueint对象。用例:库函数需要一个整数,强制某个行为的唯一简单方法是传递一个非常大的整数。

在python 2中,我可以使用sys.maxint(编辑:我错了)。在python 3中,math.inf是最接近的等价物,但我不能将其转换为int


Tags: the对象答案answer选项sys整数用例
3条回答

Konsta Vesterinen的^{}可以工作(pypi),只是它不是从int继承的,但是您可以将其子类化:

from infinity import Infinity
class IntInfinity(Infinity, int):
    pass
assert isinstance(IntInfinity(), int)
assert IntInfinity() > 1e100

另一个实现“无限”值的包是Extremes,它是从被拒绝的PEP 326中获得的;同样,您需要从extremes.Maxint中进行子类划分。

Use case: library function expects an integer, and the only easy way to force a certain behavior is to pass a very large integer.

这听起来像库中的一个缺陷,应该在其接口中修复。那么它的所有用户都会受益。它是什么图书馆?

使用重写的比较运算符创建神奇的int子类可能对您有用。不过,它很脆弱;你永远不知道图书馆会用那个东西做什么。假设它将其转换为字符串。会发生什么?随着库的发展,数据自然会以不同的方式使用;有一天,你可能会更新库,发现你的诀窍已经失效。

由于python整数是无限的,因此必须使用自定义类:

import functools

@functools.total_ordering
class NeverSmaller(object):
    def __le__(self, other):
        return False

class ReallyMaxInt(NeverSmaller, int):
    def __repr__(self):
        return 'ReallyMaxInt()'

这里我使用了类NeverSmaller中的mix,而不是ReallyMaxInt的直接修饰,因为在Python 3上,functools.total_ordering的操作会被继承自int的现有排序方法阻止。

使用演示:

>>> N = ReallyMaxInt()
>>> N > sys.maxsize
True
>>> isinstance(N, int)
True
>>> sorted([1, N, 0, 9999, sys.maxsize])
[0, 1, 9999, 9223372036854775807, ReallyMaxInt()]

注意,在python2中,sys.maxint + 1sys.maxint大,所以不能依赖它。

免责声明:这是OO意义上的整数,不是数学意义上的整数。因此,继承自父类int的算术运算可能表现不合理。如果这对您的预期用例造成了任何问题,那么可以通过实现__add__来禁用它们,而friends只需出错。

相关问题 更多 >