Nei moduli interni come peephole, l'argomento di LOAD_CONST
viene archiviato nei due byte successivi allo opcode
.Perché è possibile utilizzare più di 2^16 costanti in una funzione Python?
Ad esempio, la macro che utilizza per ottenere tesi di un'operazione viene implementata come:
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
L'argomento di LOAD_CONST
è un indice nella matrice consts
.
Quindi ho pensato che forse possiamo usare al massimo 2^16 costanti in una funzione Python.
Ma quando provo una funzione che utilizza le costanti 66666 (> 65536), continua a funzionare normalmente.
Quale potrebbe essere il motivo?
Come hai creato la funzione? Controlla 'f .__ code __. Co_consts' e vedi se ci sono tutte le costanti 66666 qui. Forse sono stati ottimizzati. – user2357112
@ user2357112 Sì, ho confermato che sono ancora lì. – satoru
Ho creato una funzione simile e l'ho decompilata con 'dis.dis'. Sembra che esista un opcode 'EXTENDED_ARG' che lo gestisce. – user2357112