J'ai le code comme:

max32 = 0xffffffffL
print(sys.getsizeof(max32))
>>32

Qui est écrit en python 2.

Maintenant, je dois m'assurer que ce code est également compatible en python 3. Mais il n'y a pas d'entier long en python3. Comment je fais ça?

0
city 21 juil. 2015 à 08:23

2 réponses

Meilleure réponse

Utilisation de PEP 0237 - long a été renommé {{X1 }}, supprimez simplement le L et utilisez-le. Exemple -

>>> max64 = 0xffffffffffffffff
>>> max64
18446744073709551615

Également de Quoi de neuf dans Python 3.0 -

PEP 0237: Essentiellement, renommé depuis longtemps en int. Autrement dit, il n'y a qu'un seul type intégral intégré, nommé int; mais il se comporte principalement comme l'ancien type long.

De plus, dans Python 3.x, il semble que int a une taille variable en fonction de l'entier qui y est stocké -

>>> max64 = 0xffffffffffffffff
>>> sys.getsizeof(max64)
22
>>> max32 = 0xffffffff
>>> sys.getsizeof(max32)
18
>>> max67 = 0xffffffffffffffffffffffffffffff
>>> sys.getsizeof(max67)
28
>>> max100 = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> sys.getsizeof(max100)
68

Vous ne devez donc pas dépendre de la taille des octets de votre code.

4
Anand S Kumar 21 juil. 2015 à 05:43

Le int en python est principalement compatible avec int en python. Le code qui fonctionne avec python2 fonctionnera dans python3 à cet égard, sauf le code qui repose sur:

  • sys.getsizeof (x) renvoyant le même résultat (ce qu'il ne fait pas de toute façon)
  • expression arithmétique contenant int s résultant dans le même type (si le résultat ne rentre pas dans un int, le résultat sera long en python2)
  • code qui repose sur l'existence d'un type long (vous pouvez toujours définir une fonction long qui fait la même chose en python3)
  • code qui repose sur le suffixe L

... et probablement d'autres situations que j'ai peut-être négligées.

Le raisonnement est qu'avec un seul type intégral, vous avez un type intégral qui agit exactement comme un entier est censé se comporter - avec un tel type, il n'y a plus ou moins besoin d'autres types intégraux qui ne se comportent pas comme les entiers sont censés se comporter (ou exiger le type long pour les compléter). L'exception est bien sûr les situations où vous voulez un comportement "mod 2 ^ n" (comme les types intégraux java, où 2 * 0x7FFFFFFF peut devenir -2), que python2 int ne supportait pas de toute façon, peut-être qu'il y a une classe pour avoir ce comportement.

0
skyking 21 juil. 2015 à 05:46