gpt4 book ai didi

python - 为什么 six.py 使用自定义类来查找 MAXSIZE?

转载 作者:太空狗 更新时间:2023-10-30 01:14:29 28 4
gpt4 key购买 nike

我正在检查 six.py 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)

最佳答案

int在 python3 中是一种多语言类,可以表示机器整数和大整数;取代 int 之间区别的功能和 long在 python 2。在 python3 上,构造 int(1 << n)从不抛出错误。

因此,为了解决这个问题,六使用了一个巧妙的技巧,强制 python 将某些内容塞入机器大小的 int 中。 len内置总是尝试转换 __len__ 的返回值变成机器大小的东西:

>>> 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

>>>

或者,在 Python 3 中,异常略有不同:

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

关于python - 为什么 six.py 使用自定义类来查找 MAXSIZE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235927/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com