Pregunta

Tengo un proyecto que está organizado algo así como

project/
    __init__.py
    builder.py
    component/
        __init__.py

Dentro builder.py, Tengo una clase llamada Builder que tiene varios atributos de clase para poder implementar el patrón Borg.El problema surge cuando intento importar Builder en component/__init__.py y realizar cambios en los atributos de clase.Parece que cualquier cambio que haga en los atributos de clase en el paquete se deshace cuando regresa la función.

ACTUALIZAR:He aquí un ejemplo sencillo de lo que está sucediendo.

constructor.py

class Builder(object):
    attribute = True

import component

print Builder.attribute

componente/___init___.py

from project.builder import Builder

Builder.attribute = False

Producción:

False
True

A juzgar por el hecho de que se imprimen dos líneas, supongo que el código en builder.py se ejecuta dos veces, lo que restablece el valor de attribute a Verdadero.

¿Fue útil?

Solución

Lo que tienes es una importación circular:El constructor importa el componente, el componente importa el constructor.

En el momento en que el constructor importa el componente, el constructor aún no está completamente construido.Luego, el componente importa el constructor, que ejecuta el resto del módulo constructor (todo después). import component).Más tarde, cuando se carga el componente, el constructor continúa nuevamente con todo lo posterior. import component.

Tenga en cuenta que el comportamiento sería diferente si el componente se cargara primero.

Básicamente, no deberías realizar importaciones circulares.Intente organizar el código de alguna otra manera.

Otros consejos

Realmente deberías mostrar (una versión simplificada de) tu código.Algo así como (asumiendo, por ejemplo.eso project está en sys.path):

import builder
builder.Builder.baah = 'boo!'

en component/__init__.py, por ejemplo, debería funcionar bien sin "deshacer" ni "restablecer".

Pero ¿qué código exactamente? son ¿Estás usando en su lugar, para realizar esos "cualquier cambio"...?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top