2014-04-13 10 views
5

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?

+1

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

+0

@ user2357112 Sì, ho confermato che sono ancora lì. – satoru

+0

Ho creato una funzione simile e l'ho decompilata con 'dis.dis'. Sembra che esista un opcode 'EXTENDED_ARG' che lo gestisce. – user2357112

risposta

6

Dalle dis documentazione:

EXTENDED_ARG (ext)

prefissi qualsiasi codice operativo che ha un argomento troppo grande per inseriscono nel due byte predefinito. ext contiene due byte aggiuntivi che, presi insieme all'argomento dell'opcode successivo, comprendono un argomento a quattro byte , ext i due byte più significativi.

Se un codice operativo richiede un argomento più di 2 byte, un opcode EXTENDED_ARG fornisce altre 2 byte di argomento.

+0

+1 .. A proposito, qualcuno ha mai sentito parlare di una funzione che richiede più di 2^16 parametri? O anche vicino a quello? – Ant

+0

@Ant Questo dovrebbe essere un caso molto raro. – satoru

Problemi correlati