Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

comment gerer plusieurs import ?

+5 votes

j'ai 3 fichiers pythons, pour le moment dans le même dossier, et je bloque sur l'import.

Mon but est d'executer main.py et d'afficher les 3 fonctions specials, qui sont definies 1 par fichier.

main.py:

import extend1
import extend2

    specials = []

    def special(function):
        specials.append(function)
        return function


    @special
    def helloWorld():
        print("Hello World!")


    if __name__ == '__main__':
        for function in specials:
            print(function.__name__)

extend1.py

import main

@main.special
def foo():
    print("foo!")

extend2.py

import main

    @main.special
    def bar():
        print("bar!")

avec juste extend1 le code s'execute mais je n'ai pas foo dans la liste et avec extend2 ca plante :

    Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import extend1
  File "/root/py/special/extend1.py", line 1, in <module>
    import main
  File "/root/py/special/main.py", line 2, in <module>
    import extend2
  File "/root/py/special/extend2.py", line 3, in <module>
    @main.special
AttributeError: 'module' object has no attribute 'special'
demandé 8-Mai-2015 par trueRap0rr
edité 9-Mai-2015 par max

2 Réponses

+3 votes
 
Meilleure réponse

Dans le premier cas, (sans importer extend2 ds le module main.py), la premiere ligne fait un import extend1, a partir de cet instant, main.py cesse de s'executer, extend1.py s'execute.

a la premiere ligne de extend1.py, il y a import main.py, des lors, extend1.py cesse de s'executer et main.py s'execute. Ceci entraine une chose: la fonction foo n'existe pas. main.py s'execute jusqu'au bout et tu vois le "hello world" mais pas le "foo!".

Dans le second cas, celui où tu importes extend1.py et extend2.py, la premiere ligne fait un import extend1, a partir de cet instant, main.py cesse de s'executer, extend1.py s'execute.

a la premiere ligne de extend1.py, il y a import main.py, des lors, extend1.py cesse de s'executer et main.py s'execute. Ceci entraine une chose: la fonction foo n'existe pas.

a la deuxieme ligne de main.py il y a un import extend2, a partir de cet instant, extend2.py tente de s'executer.

a la premiere ligne de extend2.py il y a un import main, a cet instant, il existe deja une reference au module main dans sys.modules, c'est cette reference que extend2.py va tenter d'utiliser pr s'executer jusqu'au bout.

Seulement, main.py ne s'est jamais executé jusqu'au bout, et donc special n'existe pas.

Solution: faire comme @Sam te dit, sinon reorganise tes module de maniere a eviter le "circular import"

répondu 8-Mai-2015 par Nsukami_ (1,976 points)
+3 votes

Tu as ici un problème de dépendances circulaires : main import extend qui importe main.

Si tu n'as pas besoin de extend dans main, retire l'import.

Si tu en as besoin, met le decorateur special dans un autre module, et importe le depuis chacun des modules pour éviter que extend import de main.

répondu 8-Mai-2015 par Sam (4,974 points)
...