50 votes

Comment faire un entier plus grand que n'importe quel autre entier?

Remarque: lors de la accepté de répondre permet d'atteindre le résultat que je voulais, et @ecatmur réponse donne une vue plus globale de l'option, je pense qu'il est très important de souligner que mon cas d'utilisation est une mauvaise idée en premier lieu. C'est très bien expliqué dans @Jason Orendorff réponse ci-dessous.

Remarque: cette question n'est pas un doublon de la question sur l' sys.maxint. Il n'a rien à voir avec sys.maxint; même en python 2, où sys.maxint est disponible, il ne représente PAS le plus grand entier (voir la accepté de répondre).

J'ai besoin de créer un nombre entier plus grand que n'importe quel autre nombre entier, ce qui signifie que l' int objet qui renvoie True lorsque comparé à tous les autres int objet à l'aide d' >. Cas d'utilisation: bibliothèque de fonction attend un entier, et le moyen le plus facile de forcer un certain comportement est pour passer un très grand nombre entier.

En python 2, je peux utiliser sys.maxint (edit: j'avais tort). En python 3, math.inf est l'équivalent le plus proche, mais je ne peux pas le convertir en int.

67voto

wim Points 35274

Depuis python entiers sont illimitées, vous devez le faire avec une classe personnalisée:

import functools

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

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

Ici j'ai utilisé un mélange-dans la classe NeverSmaller plutôt que de diriger la décoration d' ReallyMaxInt, parce que sur Python 3 l'action de l' functools.total_ordering aurait été empêché par les méthodes de commande hérité de l' int.

L'utilisation de la démo:

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

Notez que dans python2, sys.maxint + 1 est plus grand que sys.maxint, de sorte que vous ne pouvez pas compter sur cela.

Avertissement: Ceci est un entier dans la OO sens, il n'est pas un nombre entier dans le sens mathématique. Par conséquent, les opérations arithmétiques héritée de la classe parente int peuvent ne pas se comporter raisonnablement. Si cela pose des problèmes pour votre cas, alors ils peuvent être désactivés par la mise en œuvre de __add__ et les amis juste d'erreur.

27voto

ecatmur Points 64173

Konsta Vesterinen de l' infinity.Infinity (pypi), sauf qu'il n'héritent pas de int, mais vous pouvez sous-classe:

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

Un paquet qui le met en œuvre "l'infini" valeurs Extrêmes, ce qui a été récupéré à partir de l'rejeté PEP 326; encore une fois, vous avez besoin de sous-classe d' extremes.Max et int.

15voto

Jason Orendorff Points 15869

Cas d'utilisation: bibliothèque de fonction attend un entier, et le moyen le plus facile de forcer un certain comportement est pour passer un très grand nombre entier.

Cela sonne comme une faille dans la bibliothèque qui doit être résolu dans son interface. Alors que tous ses utilisateurs pourraient en bénéficier. Ce que la bibliothèque est-il?

La création d'un magique int sous-classe avec substituée opérateurs de comparaison pourraient travailler pour vous. C'est fragile, bien; vous ne savez jamais ce que la bibliothèque va faire avec cet objet. Supposons qu'il convertit en une chaîne. Que doit-il arriver? Et les données sont naturellement utilisés de différentes façons, comme une bibliothèque évolue; vous pouvez mettre à jour la bibliothèque un jour pour découvrir que votre tour ne fonctionne plus.

1voto

Jay Points 14781

Il me semble que ce serait fondamentalement impossible. Disons que vous écrivez une fonction qui renvoie cette RBI ("vraiment grand int"). Si l'ordinateur est capable de stocker, puis quelqu'un d'autre pourrait écrire une fonction qui renvoie la même valeur. Est votre RBI plus grand que lui-même?

Peut-être que vous pouvez obtenir le résultat souhaité avec quelque chose comme @wim réponse: Créer un objet qui remplace les opérateurs de comparaison à faire "<" toujours return false et ">" retournez toujours vrai. (Je n'ai pas écrit beaucoup de Python. Dans la plupart des langages orientés objet, cela ne fonctionne que si la comparaison met en valeur tout d'abord, SI RBI>x. Si quelqu'un écrit de la comparaison dans l'autre sens, SI x>RBI, ce sera un échec, car le compilateur ne sait pas comment faire pour comparer des nombres entiers à une classe définie par l'utilisateur.)

1voto

user2728397 Points 320

En Python 3.5, vous pouvez faire:

import math test = math.inf

Et alors:

test > 1 test > 10000 test > x

Sera toujours vrai. Sauf si, bien entendu, comme indiqué, x est également l'infini ou "nan" ("pas un nombre").

Comment puis-je représenter un nombre infini en Python?

Répondu par @WilHall

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X