Stavo passando attraverso il codice per six.py
in the django utils, che, per implementazioni non Jython, cerca, per trovare il MAXSIZE per l'int. Ora, il modo in cui questo viene fatto è interessante - invece di rilevare un'eccezione nell'istruzione stessa, l'istruzione è racchiusa all'interno di un metodo __len__
in una classe personalizzata. Quale può essere la ragione per farlo?Perché six.py usa la classe personalizzata per trovare 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
Se non sbaglio, lo stesso avrebbe potuto essere abbreviato anche in basso, giusto?
try:
1 << 31
except OverflowError:
# 32-bit
MAXSIZE = int((1 << 31) - 1)
else:
# 64-bit
MAXSIZE = int((1 << 63) - 1)
Questo sembra rispondere. Avete un link per il 'Len builtin trys sempre per convertire il valore di ritorno di __len__ in una cosa di dimensioni macchina '..? –
Il bit più pertinente, 'PyObject_Size' è definito per restituire un' Py_ssize_t' (vedere https://hg.python.org/cpython/file/b4cbecbc0781/Objects/abstract.c#l43), che in definitiva è la funzione che viene chiamato (tramite alcune macro indirette) dal file 'len' incorporato. – SingleNegationElimination