2009-03-30 17 views
58

Dada una clase C en Python, ¿cómo puedo determinar en qué archivo se definió la clase? Necesito algo que pueda funcionar desde la clase C, o desde una instancia de C.¿Cómo obtengo el filepath para una clase en Python?

La razón por la que estoy haciendo esto es porque generalmente soy un fanático de poner archivos que pertenecen juntos en la misma carpeta. Quiero crear una clase que use una plantilla de Django para presentarse como HTML. La implementación base debe inferir el nombre de archivo para la plantilla en función del nombre de archivo en el que está definida la clase.

Dije que coloque una clase LocationArtifact en el archivo "base/artifacts.py", luego deseo que el comportamiento predeterminado sea que el nombre de la plantilla es "base/LocationArtifact.html".

+0

duplicado: http://stackoverflow.com/questions/269795/how-do-i -find-the-location-of-python-module-sources, http://stackoverflow.com/questions/602846/how-can-i-access-the-current-executing-module-or-class-name-in -python –

+0

Aquellos asumen que usted conoce el módulo que está buscando. f Por ejemplo, solo tendré la cadena de módulos mientras trabajo con implementaciones de una clase. – Staale

Respuesta

82

se puede utilizar el módulo de inspect, así:

import inspect 
inspect.getfile(C.__class__) 
+3

Creo que esto funcionará para la clase, pero no para una instancia. inspeccionar.getfile (c .__ class__) debería funcionar, donde c es una instancia de C. –

+0

Tiene razón; Solo lo había usado en la clase, y simplemente asumí que funcionaría para instancias. ¡Gracias! – DNS

+0

No estoy seguro de qué estaba haciendo diferente, pero en lugar de 'getfile' tuve que usar:' inspeccionar.getmodule (C .__ clase __) ' – AJP

24

intento:

import sys, os 
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__) 
5

Este es el enfoque equivocado para Django y realmente forzar las cosas.

El patrón de aplicación típico Django es:

  • /proyecto
    • /nombreapl
      • models.py
      • views.py
      • /plantillas
        • index.html
        • etc.
+0

+1: hacer lo que Django hace naturalmente y la vida es mucho más simple. –

+0

De acuerdo. Django es uno de los marcos con la menor cantidad de "magia", pero las plantillas, las etiquetas de plantilla y las aplicaciones tienen algunas expectativas como parte de su patrón. Si tienes que hacer una inferencia de clase rara, probablemente estés yendo en la dirección incorrecta. – Soviut

Cuestiones relacionadas