为什么会这样六个月使用自定义类查找MAXSIZE?

2024-04-23 11:00:26 发布

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

我正在浏览^{} in the django utils的代码,对于非Jython实现,该代码尝试查找int的MAXSIZE。现在,这样做很有趣—不是捕获语句本身的异常,而是将语句包装在自定义类中的__len__方法中。这样做的原因是什么?你知道吗

class X(object):
    def __len__(self):
        return 1 << 31
try:
    len(X())
except OverflowError:
    # 32-bit
    MAXSIZE = int((1 << 31) - 1)
else:
    # 64-bit
    MAXSIZE = int((1 << 63) - 1)
del X

如果我没有错的话,同样的也可以缩短到下面,对吗?你知道吗

try:
    1 << 31
except OverflowError:
    # 32-bit
    MAXSIZE = int((1 << 31) - 1)
else:
    # 64-bit
    MAXSIZE = int((1 << 63) - 1)

Tags: thedjango代码inlenbitutils语句
1条回答
网友
1楼 · 发布于 2024-04-23 11:00:26

python3中的int是一个poly-glot类,它可以表示机器int和大int;这个特性超越了python2中intlong之间的区别。在python3上,构造int(1 << n)从不抛出错误。你知道吗

为了解决这个问题,six使用了一个巧妙的技巧,它迫使python将一些东西塞进机器大小的int中

>>> class Lengthy(object):
...     def __init__(self, x):
...         self.x = x
...     def __len__(self):
...         return self.x
...     
>>> int(1<<100)
1267650600228229401496703205376L
>>> type(int(1<<100))
<type 'long'>
>>> len(Lengthy(1<<100))
Traceback (most recent call last):
  File "<ipython-input-6-6b1b77348950>", line 1, in <module>
    len(Lengthy(1<<100))
OverflowError: long int too large to convert to int

>>> 

或者,在Python3中,例外情况略有不同:

>>> len(Lengthy(1<<100))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: cannot fit 'int' into an index-sized integer
>>> 

相关问题 更多 >