Ich ging durch den Code für six.py
in the django utils, die für Nicht-Jython-Implementierungen versucht, die MAXSIZE für den Int zu finden. Nun, die Art und Weise, wie dies gemacht wird, ist interessant - anstatt eine Ausnahme für die Anweisung selbst zu erfassen, wird die Anweisung in eine __len__
Methode in einer benutzerdefinierten Klasse eingeschlossen. Was kann der Grund dafür sein?Warum verwendet six.py eine benutzerdefinierte Klasse zum Suchen von MAXSIZE?
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
Wenn ich nicht falsch liege, könnte dies auch für die unten als auch verkürzt wurde, nicht wahr?
try:
1 << 31
except OverflowError:
# 32-bit
MAXSIZE = int((1 << 31) - 1)
else:
# 64-bit
MAXSIZE = int((1 << 63) - 1)
Dies scheint sie zu beantworten. Haben Sie einen Link für das 'Die eingebaute Lenin versucht immer, den Rückgabewert von __len__ in eine maschinengroße Sache umzuwandeln '..? –
Das relevanteste Bit, 'PyObject_Size' ist so definiert, dass es ein' Py_ssize_t' zurückgibt (siehe https://hg.python.org/cpython/file/b4cbecbc0781/Objects/abstract.c#l43), was letztendlich die Funktion ist, die wird (über ein paar Makro-Direktionen) von dem eingebauten "len" aufgerufen. – SingleNegationElimination