Estoy usando ZODB
que, según tengo entendido, usa pickle
para almacenar instancias de clase. Estoy haciendo un poco de refactorización donde quiero dividir mi archivo models.py
en varios archivos. Sin embargo, si hago esto, no creo que pickle
pueda encontrar las definiciones de clase, y por lo tanto no podrá cargar los objetos que ya he almacenado en la base de datos. ¿Cuál es la mejor manera de manejar este problema?pickle/zodb: cómo manejar archivos .py en movimiento con definiciones de clase?
Respuesta
Puede crear alias; debido a que un módulo models.py
se está dividiendo en múltiples módulos nuevos, solo puede hacerlo al importar sus clases a la ubicación anterior.
Ambos métodos provocan que las copias nuevas de los encuadres de su instancia se refieran a la nueva ubicación; Si puede forzar una escritura en todas las instancias de las clases movidas, no necesita conservar los alias. Puede hacer esto configurando _p_changed
en True
en sus instancias que desea que se vuelvan a escribir.
Por lo tanto, para crear los alias, importar sus clases movido en la antigua ubicación:
from newmodule1 import MyClass1, MyClass2
from newmodule2 import MyClass3
Si sólo cambiar el nombre un módulo (lo que las mismas clases todos se encuentran en una nueva ubicación, podría ser un conjunto de ellos mismos importaciones), también puede crear una entrada de sys.modules
para el antiguo nombre:
import sys
import newmodule
sys.modules['full.path.to.old.module] = newmodule
Desafortunadamente, no hay una solución fácil. Usted puede convertir sus objetos de estilo antiguo con las refactorizado queridos (me refiero a las clases que se encuentran en otro archivo/módulo) por el siguiente esquema
- añadir las clases refactorizado a su código sin eliminación de los viejos-unos
- paseo a través de su base de datos a partir de la raíz y la sustitución de todos los objetos antiguos con nuevos equivalentes
- comprimir su base de datos (que es importante)
- ahora se puede quitar sus viejas clases de las fuentes
sí tenía la esperanza de no tener que hacer algo así. la solución de alias parece prometedora ... – Claudiu
@Claudiu No me gusta la solución de aliasing ya que trae desorden en el código. Pero funciona, por supuesto :-) –
Siempre que desee que el pickle se pueda cargar sin realizar una migración a la nueva estructura de modelo de clase: puede usar importaciones de alias de las clases refactorizadas dentro de la ubicación del antiguo model.py.
- 1. Codificación para archivos .py multilingües
- 2. cómo utilizar la opción con pep8.py
- 3. ¿Qué debo nombrar mis archivos con definiciones de clases genéricas?
- 4. ¿Cómo dividir la aplicación del matraz en varios archivos py?
- 5. archivos PyInstaller pero manteniendo .py actualizables
- 6. ¿Cómo puedo manejar archivos estáticos con Python webapp2 en Heroku?
- 7. Llamar código python (archivos .py) desde C#
- 8. ¿Cómo manejar valores vacíos en archivos de configuración con ConfigParser?
- 9. redis-py con gevent
- 10. ¿Cómo manejar la localización en archivos JavaScript?
- 11. Cómo manejar ~ en las rutas de archivos
- 12. Importación de archivos en Python desde __init__.py
- 13. Java: ¿Cómo verificar las definiciones genéricas del tipo de clase?
- 14. Embalaje de archivos de Python en un solo script .py
- 15. "Con" instrucción en Python con varios archivos para manejar
- 16. ¿Cómo manejar una clase Java con cientos de campos?
- 17. ¿Cómo escribir buenos archivos correctos __init__.py/paquete
- 18. ¿Cómo puedo manejar archivos grandes en Ruby?
- 19. usando __init__.py
- 20. ¿Cómo integrar pep8.py en Eclipse?
- 21. ¿Cómo manejar mejor los archivos de datos con CMake?
- 22. ¿Debo crear cada clase en su propio archivo .py?
- 23. Seguimiento del movimiento del mouse en la clase QGraphicsScene
- 24. poniendo definiciones de funciones en los archivos de cabecera
- 25. Definiciones de plantilla fuera del cuerpo de clase
- 26. Las variables locales en las definiciones de clase/ámbito
- 27. Cuándo usar archivos de encabezado que no declaran una clase pero tienen definiciones de función
- 28. ¿Cómo manejar archivos comprometidos con Git en Linux con nombres de archivo de Windows inválidos?
- 29. uso de __init__.py
- 30. Python: ¿cómo se ejecuta un archivo .py?
ah, esto parece ser lo que quiero. Así que pickle, al cargar las instancias existentes, se verá en el antiguo 'models.py', encontrará el nombre de clase, y cargará la clase correctamente, pero la clase cargada estará realmente en la nueva ubicación ... inteligente – Claudiu
@Claudiu: Exactamente , por lo tanto, al escribir un nuevo pickle para la clase, usará la nueva ruta del módulo. –