2012-02-03 14 views
5
def c(): 
    def a(): 
     print dir() 

    def b(): 
     pass 

    a() 

c() 

Probabilmente una domanda molto semplice, ma non riesco a trovare una risposta da googling. Ho il codice sopra, e voglio che un metodo stampi lo spazio dei nomi che contiene i metodi aeb, cioè voglio che stampi lo spazio dei nomi del form point che è chiamato. È possibile? Preferibilmente in Python 2.xAccesso allo spazio dei nomi padre in python

+0

vorrei provare globali() in Python 3 c'è un altro modo per farlo così –

+1

Perché vuoi fare questo? –

+0

Ho già spiegato nei commenti le due risposte: fondamentalmente sto cercando vulnerabilità nella nostra applicazione di test online per i nostri studenti. Come sembra corretto, dobbiamo impedire agli studenti di decodificare il codice di test per trovare la soluzione. (Ovviamente ogni studente abbastanza intelligente da scoprirlo dovrebbe anche avere competenze sufficienti per superare gli esercizi) – nvcleemp

risposta

5

È possibile utilizzare il modulo inspect dalla libreria standard di Python:

import inspect 

def c(): 
    def a(): 
     frame = inspect.currentframe() 
     print frame.f_back.f_locals 

    def b(): 
     pass 

    a() 

c() 

Ma frames opportuno sopprimere dopo l'uso, vedi note.


Risposta al commento.

modo possibile per limitare l'ispezione funzionalità per gli studenti:

import sys 
sys.modules['inspect'] = None 
sys._getframe = None 
+0

Cattiva idea. Questo è costoso e sporco –

+0

In realtà, questo fa esattamente quello che temevo fosse possibile: gli studenti possono usare inspect per stampare la fonte delle funzioni che usiamo per testare i loro esercizi. Grazie. Ora ho un possibile attacco e tocca a me trovare un modo per proteggerlo. – nvcleemp

+0

@nvcleemp, penso che sia possibile limitare l'uso di 'inspect' e' sys._getframe'. – reclosedev

2

vorrei andare con locals() in questo modo:

def c(): 
    def a(locals_): 
     print locals_ 

    def b(): 
     pass 

    a(locals()) 

c() 
+0

Sì, sarebbe perfetto, ma non posso cambiare la firma della funzione a e non posso cambiare il punto da cui è chiamato. (Fondamentalmente sto cercando di scoprire quali attacchi potrebbero utilizzare i miei studenti per scoprire come vengono verificate le soluzioni nella nostra applicazione di test online) – nvcleemp

+0

Perché mischi/immetti codice studenti con parte del tuo codice ..? Sembra così strano Perché non importare semplicemente come un modulo e chiamare le funzioni regolarmente. O ancora, sembra ancora più semplice. Oppure usa RestrictedPython per qualcosa di veramente sicuro. – Ski

+0

Utilizziamo un sito web esistente (spoj.pl), ma abbiamo scritto alcuni giudici personalizzati per fornire più feedback ai nostri studenti. Uno di questi giudici prende il codice degli studenti, lo esegue e poi esegue un doctest e dà agli studenti il ​​risultato di questo doctest. Sembra che io abbia avuto un po 'di sorveglianza un po' troppo presto: pensavo che avrebbero potuto usare inspect.getsource, ma dal momento che il codice che viene eseguito è generato, sembra che non sia possibile ottenere il codice sorgente in quel modo. – nvcleemp

Problemi correlati