Domanda

Ho un progetto che è organizzato qualcosa come

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

Entro builder.py, ho una classe chiamata Builder che ha diversi attributi di classe per implementare il modello Borg.Il problema sorge quando provo a importare il costruttore in component/__init__.py e apportare modifiche agli attributi di classe.Sembra che qualunque cosa modifica piaccia agli attributi di classe nel pacchetto siano annullati quando la funzione restituisce.

Aggiornamento: qui è un semplice esempio di cosa sta succedendo.

Builder.py

class Builder(object):
    attribute = True

import component

print Builder.attribute
.

Componente / ___ Init ___. PY

from project.builder import Builder

Builder.attribute = False
.

Uscita:

False
True
.

A giudicare dal fatto che vengono stampate due linee, immagino che il codice in builder.py viene eseguito due volte, il che ripristina il valore di attribute a TRUE.

È stato utile?

Soluzione

Quello che hai è un'importazione circolare: il componente delle importazioni del costruttore, il componente import Builder.

Al componente IMPORTS Time Builder, Builder non è ancora completamente costruito.Quindi componente Importa Builder, che esegue il modulo di riposo del modulo Builder (tutto dopo import component).Successivamente, quando il componente è caricato, il costruttore continua di nuovo con tutto dopo import component.

Nota che il comportamento sarebbe diverso se il componente è stato caricato prima!

Fondamentalmente, non dovresti fare importazioni circolari.Prova a organizzare il codice in qualche altro modo.

Altri suggerimenti

Dovresti davvero mostrare (una versione semplificata di) il tuo codice.Qualcosa di simile (assumendo E.G. che project è in sys.path):

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

In component/__init__.py, ad esempio, dovrebbe funzionare bene senza "annullamento" né "reset".

Ma quale codice esattamente è che usi invece, per eseguire quelle "Qualunque cosa cambia" ...?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top