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

    def b(): 
     pass 

    a() 

c() 

Probablemente una pregunta realmente simple, pero parece que no puedo encontrar una respuesta buscando en Google. Tengo el código anterior, y quiero que el método para imprimir el espacio de nombres que contiene los métodos ayb, es decir, quiero que imprima el espacio de nombres de la forma de puntos a la que se llama. es posible? Preferentemente en Python 2.xAccede al espacio de nombres primario en python

+0

me gustaría probar globales() en Python 3 hay otra manera de hacerlo así –

+1

¿Por qué quieres hacer esto? –

+0

Ya expliqué en los comentarios sobre las dos respuestas: básicamente, busco vulnerabilidades en nuestra aplicación de evaluación en línea para nuestros estudiantes. Como parece ser correcto, debemos evitar que los estudiantes realicen ingeniería inversa del código de prueba para encontrar la solución. (Por supuesto, cualquier estudiante lo suficientemente inteligente como para descubrir esto también debería tener las habilidades suficientes para aprobar los ejercicios) – nvcleemp

Respuesta

5

Usted puede utilizar inspect módulo de la biblioteca estándar de Python:

import inspect 

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

    def b(): 
     pass 

    a() 

c() 

Pero frames debería eliminarse después de su uso, ver note.


Responder para comentar.

manera posible restringir inspeccionar características para los estudiantes:

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

Mala idea. Esto es caro y sucio –

+0

En realidad, esto hace exactamente lo que temía que fuera posible: los estudiantes pueden usar inspect para imprimir la fuente de las funciones que usamos para probar sus ejercicios. Gracias. Ahora tengo un posible ataque y depende de mí encontrar una manera de protegerme contra él – nvcleemp

+0

@nvcleemp, creo que es posible restringir el uso de 'inspeccionar' y' sys._getframe'. – reclosedev

2

Me gustaría ir con locals() así:

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

    def b(): 
     pass 

    a(locals()) 

c() 
+0

Sí, eso funcionaría, pero no puedo cambiar la firma de la función a y no puedo cambiar el punto desde el cual se llama. (Básicamente, estoy tratando de encontrar qué ataques podrían usar mis alumnos para descubrir cómo se verifican las soluciones en nuestra aplicación de prueba en línea) – nvcleemp

+0

¿Por qué mezclar/inyectar el código de los estudiantes con parte de su código ...? Se ve tan extraño. ¿Por qué no simplemente importar como un módulo y llamar funciones regularmente? O eval, aún suena más simple. O bien, use RestrictedPython para algo realmente seguro. – Ski

+0

Utilizamos un sitio web existente (spoj.pl), pero hemos escrito algunos jueces personalizados para proporcionar más retroalimentación para nuestros estudiantes. Uno de estos jueces toma el código de los estudiantes, lo ejecuta y luego ejecuta un doctest y les da a los estudiantes el resultado de este doctest. Parece que me había acostumbrado demasiado pronto: pensé que podrían usar inspect.getsource, pero dado que se genera el código que se ejecuta, parece que no es posible obtener el código fuente de esa manera. – nvcleemp

Cuestiones relacionadas