如何使整数大于任何其他整数?

max*_*max 50 python infinity python-3.x

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

注意:这个问题不是关于的问题sys.maxint的重复.它与此无关sys.maxint; 即使在sys.maxint可用的python 2中,它也不代表最大整数(参见接受的答案).

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

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

wim*_*wim 67

由于python整数是无界的,你必须使用自定义类:

import functools

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

class ReallyMaxInt(NeverSmaller, int):
    def __repr__(self):
        return 'ReallyMaxInt()'
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了混合类,NeverSmaller而不是直接装饰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()]
Run Code Online (Sandbox Code Playgroud)

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

免责声明:这是OO意义上的整数,它在数学意义上不是整数.因此,从父类继承的算术运算int可能行为不合理.如果这会导致您的预期用例出现任何问题,那么可以通过实现__add__和朋友禁用它们来解决错误.

  • 嗯,这就是事情,没有"可以适应int的最大值".您可以整天制作更大的int,直到内存不足为止.这个*在OO意义上是一个*int,它只是一个强大的int.如果您不希望允许数学运算,可以定义它们以引发异常或返回"NotImplemented". (24认同)
  • 只需快速注意:正如``ReallyMaxInt()+ 1`这样的东西返回`1`,`ReallyMaxInt()*1`返回'0`等等.这可能不是预期的. (16认同)
  • 如果"库"是Python库,这将起作用.如果它是一个本机库,那么你需要它所期望的任何本机类型的最大值. (11认同)
  • @max一个`int`的值是*unbounded*(可用内存除外),这意味着没有最大值,但*unbounded*与*infinite*不同. (8认同)
  • @RickTeachey是的,这是子类化内置函数时的问题.要获得"正确"的子类,您必须实现所有特殊方法**和**`__r*__`变体.在这种情况下它应该很容易,因为你总是可以返回`self`,这样`ReallyMaxInt()+ 1 == ReallyMaxInt()`.但你可以通过以下方式自动化:`for name in('add','mul','pow'):exec('__ {0} __ = __r {0} __ = lambda self,other:self " .format(名称))` (5认同)
  • 无论哪个类的方法被称为胜利.如果你继承`ReallyMaxInt`,你的子类更大(由于有关运算符重载在python中运行的方式的详细信息). (4认同)
  • @Havenard只是一个对象,它可以在任何需要`int`的地方工作,但是会有一个比任何`int`更大的特殊属性. (2认同)
  • 聪明,聪明! (2认同)
  • 如果我要写一个类似的ReallyReallyMaxInt类,那两个中哪个会更大? (2认同)

eca*_*mur 27

Konsta Vesterinen infinity.Infinity将工作(pypi),除了它不继承int,但你可以将它子类化:

from infinity import Infinity
class IntInfinity(Infinity, int):
    pass
assert isinstance(IntInfinity(), int)
assert IntInfinity() > 1e100
Run Code Online (Sandbox Code Playgroud)

另一个实现"无限"值的包是Extremes,它是从被拒绝的PEP 326中抢救出来的; 再次,你需要从extremes.Max和子类int.

  • 很好的解决方案,它给出了更好的数学,例如`1/IntInfinity()== 0`是真的.如果你让他们战斗,那么`ReallyMaxInt()> IntInfinity()`反之亦然......让我们称它为平局! (3认同)

Jas*_*rff 15

用例:库函数需要一个整数,强制某种行为的唯一简单方法是传递一个非常大的整数.

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

使用重写的比较运算符创建一个神奇的int子类可能对您有用.但它很脆弱; 你永远不知道图书馆将对该对象做什么.假设它将其转换为字符串.应该怎么办?随着图书馆的发展,数据自然会以不同的方式使用; 您有一天可能会更新库,发现您的技巧不再有效.

  • 很好的一点.我没有想到这样一个事实,除了比较之外,我不知道库对我的整数做了什么.我认为对我的用例的正确答案是,如果没有标准的无限整数(图书馆可能已经知道并测试过),那么就没有安全的方法来实现我想要的东西. (2认同)
  • @max你还说它是一个GUI库,对吗?(你提到了窗口大小.)`sys.maxint`将大于任何*sane*窗口大小,即使它不是Python中最大的可能整数.另外,你真的知道整数在库中的内存中是如何表示的吗?例如,它可以包含一些用C编译的组件,这些组件只是*假设*窗口大小可以适合*native*整数值,在这种情况下,传递任何大于该值的东西可能会表现得很糟糕. (2认同)