Semplicemente non funzionerà.
cosa si sta cercando di fare è, in sostanza, lo spazio nome del chiamante.
Prova questo:
print "0", locals()
def foo(): pass
print "1", locals()
del foo
print "2", locals()
noti che
- i locali DICT a 0 e 2 sono identici, e ad 1 quasi - tranne che ha il compito aggiuntivo di
foo
.
del
è una dichiarazione e non una funzione
Se fate la del
in una funzione delete_function()
, in sostanza, l'assegnazione all'interno della vostra funzione viene rimosso (che è effectless perché la funzione è terminata immediatamente), mentre il chiamante mantiene il compito.
Rigorosamente parlato, del
non elimina gli oggetti, ma semplicemente le assegnazioni da nomi agli oggetti. Gli oggetti vengono cancellati "automaticamente" (garbage collection) non appena non vengono più referenziati.
potrebbe funzionare ciò che si tenta di fare mediante ispezione dello stack frame e il passaggio del nome da cancellare come una stringa, ma sarebbe una valle di lacrime.
Forse si tenta
del locals()['foo']
o
locals()['foo'] = 42
? Ma penso che non sia garantito che modifichi realmente il dizionario dei veri locals, potrebbe anche funzionare su una copia e quindi rimanere senza effetto ...
qual è il problema che si spera di risolvere con questa tecnica? – SingleNegationElimination
Infatti. Perché, per l'amore del codice, perché? – Macke
Se devi fare questo, probabilmente c'è qualcosa di sbagliato nella tua implementazione. –