In una precedente domanda di ieri, nei commenti, sono venuto a sapere che in python __code__
atrribute di una funzione è mutabile. Quindi posso scrivere codice come seguePerché __code__ per una funzione (Python) mutabile
def foo():
print "Hello"
def foo2():
print "Hello 2"
foo()
foo.__code__ = foo2.__code__
foo()
uscita
Hello
Hello 2
ho provato googling, ma sia perché non ci sono informazioni (dubito fortemente questo), o la parola chiave (__code__
) non è facilmente ricercabili , Non sono riuscito a trovare un caso d'uso per questo.
Non sembra del tipo "perché la maggior parte le cose in Python sono mutabili" è una risposta ragionevole o, perché altri attributi di funzioni - __closure__
e __globals__
- sono esplicitamente di sola lettura (da Objects/funcobject.c):
static PyMemberDef func_memberlist[] = {
{"__closure__", T_OBJECT, OFF(func_closure),
RESTRICTED|READONLY},
{"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
{"__globals__", T_OBJECT, OFF(func_globals),
RESTRICTED|READONLY},
{"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
{NULL} /* Sentinel */
};
Perché __code__
può essere scritto mentre altri attributi sono di sola lettura?
Non è possibile impedire qualsiasi tipo di "nefandezza" in Python, '__code__' o no. Affidati ai moduli usati o non li usi. – user2864740
Sì. Ho trovato che di solito è il caso. Ma ho ancora pensato di chiedere. –
Esercitati in pile sicure invece di collegarti a API sconosciute. – TigerhawkT3