Search code examples
pythonpython-3.xinfinity

How to make an integer larger than any other integer?


Note: while the accepted answer achieves the result I wanted, and @ecatmur answer provides a more comprehensive option, I feel it's very important to emphasize that my use case is a bad idea in the first place. This is explained very well in @Jason Orendorff answer below.

Note: this question is not a duplicate of the question about sys.maxint. It has nothing to do with sys.maxint; even in python 2 where sys.maxint is available, it does NOT represent largest integer (see the accepted answer).

I need to create an integer that's larger than any other integer, meaning an int object which returns True when compared to any other int object using >. Use case: library function expects an integer, and the only easy way to force a certain behavior is to pass a very large integer.

In python 2, I can use sys.maxint (edit: I was wrong). In python 3, math.inf is the closest equivalent, but I can't convert it to int.


Solution

  • Python integers are unbounded, but you can easily create a subclass of int and override the comparison operators. This provides a way to get an integer instance which which compares as large as any other integer instance:

    import functools
    
    @functools.total_ordering
    class NeverSmaller:
        def __le__(self, other):
            return False
    
    class ReallyMaxInt(NeverSmaller, int):
        def __repr__(self):
            return 'ReallyMaxInt()'
    

    Here I've used a mix-in class NeverSmaller rather than direct decoration of ReallyMaxInt, because on Python 3 the action of functools.total_ordering would have been prevented by existing ordering methods inherited from int.

    Usage demo:

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

    Note that in Python 2, sys.maxint + 1 is bigger than sys.maxint, so you can't rely on that.

    Disclaimer: This is an integer in the OO sense, it is not an integer in the mathematical sense. Consequently, arithmetic operations inherited from the parent class int may not behave sensibly. If this causes any issues for your intended use case, then other comparisons can be disabled by implementing __add__ etc to just error out.