Pergunta

Eu tenho um projeto que está organizado algo como

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

Dentro de builder.py, tenho uma classe chamada Builder que possui vários atributos de classe para implementar o padrão Borg.O problema surge quando tento importar o Builder em component/__init__.py e faça alterações nos atributos da classe.Parece que quaisquer alterações que eu faça nos atributos de classe do pacote serão desfeitas quando a função retornar.

ATUALIZAR:Aqui está um exemplo simples do que está acontecendo.

construtor.py

class Builder(object):
    attribute = True

import component

print Builder.attribute

componente/___init___.py

from project.builder import Builder

Builder.attribute = False

Saída:

False
True

A julgar pelo fato de que duas linhas são impressas, eu diria que o código em builder.py está sendo executado duas vezes, o que zera o valor de attribute para Verdadeiro.

Foi útil?

Solução

O que você tem é uma importação circular:construtor importa componente, construtor de importações de componente.

No momento em que o construtor importa o componente, o construtor ainda não está totalmente construído.Em seguida, o componente importa o construtor, que executa o resto do módulo construtor (tudo depois import component).Mais tarde, quando o componente é carregado, o construtor continua novamente com tudo depois import component.

Observe que o comportamento seria diferente se o componente fosse carregado primeiro!

Basicamente, você não deve fazer importações circulares.Tente organizar o código de alguma outra forma.

Outras dicas

Você realmente deveria mostrar (uma versão simplificada) do seu código.Algo como (assumindo, por ex.que project está em sys.path):

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

em component/__init__.py, por exemplo, deve funcionar bem, sem "desfazer" nem "redefinir".

Mas qual código exatamente são você está usando, em vez disso, para realizar essas "quaisquer alterações" ...?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top