Python: importar módulo sin ejecutar script

Miré una pregunta similar pero en realidad no responde la pregunta que tengo. Digamos que tengo el siguiente código (demasiado simplificado para resaltar solo mi pregunta).

class A: def __init__(self,x): self.val = x a = A(4) print a.val 

Este código reside en un archivo someones_class.py . Ahora quiero importar y usar la clase A en mi progtwig sin modificar someones_class.py . Si lo hago from someones_class import A , Python todavía ejecutaría las líneas de script en el archivo.

Pregunta: ¿Hay alguna forma de importar la clase A sin que se ejecuten las dos últimas líneas?

if __name__ == '__main__' cosa pero no tengo la opción de modificar el archivo someones_class.py ya que se obtiene solo después de que mi progtwig comience a ejecutarse.

Esta respuesta es solo para demostrar que se puede hacer, pero obviamente necesitaría una mejor solución para asegurarse de incluir las clases que desea incluir.

 >>> code = ast.parse(open("someones_class.py").read()) >>> code.body.pop(1) <_ast.Assign object at 0x108c82450> >>> code.body.pop(1) <_ast.Print object at 0x108c82590> >>> eval(compile(code, '', 'exec')) >>> test = A(4) >>> test <__main__.A instance at 0x108c7df80> 

Puede inspeccionar el cuerpo del code para los elementos que desea incluir y eliminar el rest.

NOTA: Este es un hack gigante.

No, no hay forma de evitar que esas líneas adicionales se ejecuten. Lo mejor que puedes hacer es leer la secuencia de comandos y analizar la clase, usándola para crear la clase que deseas.

Probablemente sea mucho más trabajo del que desea hacer, pero, para la voluntad fuerte, el módulo ast podría ser útil.

No, no hay manera. Al menos no sin trucos extremos … es decir, prácticamente todo es posible en Python si estás dispuesto a hackear alguna “solución” extraña.

¿De dónde viene ese “someones_class.py”? ¿Por qué no puedes cambiarlo? Quiero decir, edita el archivo, no lo cambies de tu código. ¿Puede decirle a la persona que lo escribió que no escriba un código de prueba en el nivel superior?

Hay una lección interesante (y algo importante) sobre Python escondida aquí: que “clase A:” no es una statement. En realidad, es el código que el intérprete de Python ejecuta al cargar el archivo.