0
votes

Difficulté à importer en python

J'essaie de créer un module nécessitant des variables de la classe principale, j'ai donc importé lesdites variables au module, mais lorsque j'essaie de tester mon nouveau module en l'important dans la classe principale, il est dit qu'il peut " t Importez-le.

Il semble être parce que je importe la classe principale du nouveau module qui provoque le problème car chaque fois que je supprimais l'importation, cela ne fonctionne plus, mais il ne peut plus accéder aux variables de la classe principale nécessaire à la fonction. p>

la classe principale: p> xxx pré>

le nouveau module: p> xxx pré>

quand je cours le principal classe I obtenez ceci: p> xxx pré>

et quand j'exécute le nouveau module, je reçois ceci: p>

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
ImportError: cannot import name 'variable1' from 'Main' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py)


2 commentaires

La source du problème peut être les importations récursives. Vous ne devriez pas faire d'importer deux fichiers les uns des autres


@Jammydodger Voulez-vous dire des importations circulaires?


5 Réponses :


0
votes

Vous pouvez mettre à jour MOD.TASK () pour recevoir deux paramètres supplémentaires, vous obtiendriez ainsi:

mod.task(variable1, variable2)


0 commentaires

3
votes

Votre problème ici est appelé " dépendance circulaire ". Main.py essaie d'importer une classe de mod.py, mais avant que cela puisse arriver, MOD doit importer des variables de Main.py, mais avant que cela puisse arriver ...

Généralement, le moyen de résoudre une dépendance circulaire est de réorganiser comment votre programme est aménagé. Par exemple, vous pourriez être en mesure de paramétrer le mod de telle sorte qu'il ne dépend plus de la principale. Par exemple:

main.py: xxx

mod.py: xxx

alternativement, Vous pouvez stocker variable1 et variable2 dans un fichier différent. Trouver la meilleure solution dépendra de ce qui est le plus sens à votre programme.


0 commentaires

0
votes

Ceci est causé par la dépendance circulaire

comme mentionné dans la réponse ci-dessus, la manière de résoudre une dépendance circulaire consiste à réorganiser la manière dont votre programme est disposé. Utilisez paramètres

Néanmoins, une solution de contournement simple pour cela consiste à faire importations en ligne

< fort> main.py xxx

mod.py xxx


1 commentaires

Bien que ce code fonctionne, la dépendance circulaire est toujours présente: les deux modules peuvent toujours s'importer, ce qui entraîne un comportement inattendu. Votre code imprime en fait la réponse deux fois (!): Une fois pour importer le principal de MOD et une fois à partir de l'exécution de la principale.



0
votes

Suivez les principes secs. Ne te répète pas.

Importation de variables "principales" dans MOD, provoque une dépendance circulaire. Quelque chose que vous devez éviter à tout prix. Utilisez la programmation d'objet orientale pour résoudre votre problème. p>

étapes pour résoudre le problème: strong> p>

  1. Supprimez l'importation de la principale. li>
  2. Changer la fonction de tâche pour permettre la transmission de deux arguments. Ça devrait être quelque chose comme ça p>

    Mod.task(variable1, variable2)
    
  3. sur le script principal, appelez simplement la fonction: p>

    def task(self, variable1, variable2):
       print(variable1 + variable2)
    


0 commentaires

0
votes

Je ne comprends pas ce que vous voulez dire en Java, de telles choses peuvent être faites .. Mais c'est un peu possible dans Python concernant la règle que les corps des modules de référencement circuits doivent pouvoir exécuter sans accès aux autres modules concernés.
Donc, vous pouvez faire: xxx xxx

par exemple. Ou gérer l'initialisation des modules avec des fonctions que vous appelez après la réussite de la chaîne d'importation.
Quoi qu'il en soit, mieux il est préférable d'éviter de telles choses une initialisation juste des classes et des fonctions d'appel avec des paramètres.


0 commentaires