Default __init__ per oggetti di codice
-
02-01-2020 - |
Domanda
Ho trovato oggetti di codice in Python.Sono curioso di sapere cosa fanno ciascuna delle variabili nei costruttori.Non ci sono molte informazioni su di loro nella funzione di aiuto incorporato tutto quello che ho ricevuto è stato:
class code(object)
| code(argcount, nlocals, stacksize, flags, codestring, constants, names,
| varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])
|
| Create a code object. Not for the faint of heart.
.
che ovviamente non è molto informativo.Quali tipi si aspettano ciascuno di questi ingressi e cosa fanno i valori? Nota: Ho posto questa domanda dalla curiosità accademica, e non per uno scopo di codifica specifico.
Soluzione
Un oggetto Code Python è per lo più solo un contenitore per i suoi attributi.Ciascuno degli argomenti che vedi per il costruttore diventa un attributo con un prefisso co_
(ad esempio l'argomento argcount
diventa l'attributo co_argcount
).
Il costruttore esegue un po 'di convalida, quindi se gli argomenti non sono del tipo giusto, allineerà subito un'eccezione (anziché solo fallire quando l'oggetto Codice viene utilizzato in seguito).
Per quanto riguarda ciò che gli argomenti e gli attributi significano, questo è per lo più documentato in un grande tavolo in La documentazione per il modulo inspect
.Ecco la parte rilevante:
code co_argcount number of arguments (not including * or ** args)
co_code string of raw compiled bytecode
co_consts tuple of constants used in the bytecode
co_filename name of file in which this code object was created
co_firstlineno number of first line in Python source code
co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
co_lnotab encoded mapping of line numbers to bytecode indices
co_name name with which this code object was defined
co_names tuple of names of local variables
co_nlocals number of local variables
co_stacksize virtual machine stack space required
co_varnames tuple of names of arguments and local variables
.
Gli attributi co_freevars
e co_cellvars
non sono documentati per quanto posso vedere.Sono legati alle chiusure, penso.