IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

références croisées avec import


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut références croisées avec import
    Bonjour, je voudrais faire appel à une fonction de "main.py" dans un import et je n'y arrive pas. Exemple:

    ******** dans main.py ********

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from test import *
    def func1():
      return
     
    test_func1() # défini dans imp.py
    ********** dans test.py *******
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def test_func1():
      func1()  # défini dans main.py
    ****************

    J'ai fait des essais comme:

    func1()
    __main__.func1()
    main.func1()

    Mais aucun n'a fonctionné. L'appel a func1() ne passe pas, la référence est toujours mauvaise. Y-a-t'il une solution? Merci

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Le plus simple pour vous est de passer la fonction en argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # main.py
    from test import *
     
    def func1():
        print('pass')
     
    test_func1(func1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #test.py
    def test_func1(functouse):
        functouse()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'avais pensé à cette solution, mais je me demandais s'il y avait dans Python un mécanisme permettant d'avoir ce type de référence. Le problème est d'avoir un appel depuis un import d'une fonction définie dans le fichier origine (sans le passer en paramètre). C'est naturel à faire dans l'autre sens (appel depuis le fichier origine), mais cela ne semble pas simple depuis le fichier le fichier importé. Pourtant je pensais que le symbole func1 était défini dans le contexte de test_func1. Mais cela ne semble pas le cas et je ne trouve pas de nomage permettant d'y accéder.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    En Python, tout est possible mais pas nécessairement recommandable.
    Puisque vous insistez, vous pourriez écrire test.py ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import sys
    def test_func1():
        main.func1()
    main = sys.modules['__main__']
    Ca marche comment?
    à l'instant t, tous les modules importés vont dans sys.modules un dict dont la clé est le nom du module. Dans le cas du script principal, il s'appelle toujours '__main__'. On peut donc aller récupérer le module et à partir de là appeler la fonction func1 qu'il contient.

    Pourquoi il faut éviter de ?

    Parce que cela introduit une dépendance croisée entre les modules main et test. Dans la pratique, modifiez le nom de la fonction dans l'un impliquera modifier aussi le nom de la fonction dans l'autre...
    Avec une fonction çà passe mais avec des dizaines de fonctions dans plusieurs modules, çà deviendra vite casse bonbons d'avoir oublié de...

    Comme il s'agit de "test", à la méthode proposé par PauseKawa, je préfère construire un module dans lequel il y aura func1 et test_func1 (autant de fois que nécessaire) et utiliser l'astuce if __name__ == '__main__': pour lancer les tests lorsque le script contenant les "fonctions" est appelé.
    Exemple, module.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def func1():
        print ('fct1 pass')
    if __name__ == '__main__':
        def test_func1():
            func1()
        test_func1()
    Ca permet de faire des choses "basiques" pour tester les 'fonctionalités' du module et la cohésion est assurée par l'inclusion des tests.
    Pour plus compliqué, vous avez les modules unittest, doctest,...
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les références croisées avec LaTeX
    Par Winnt dans le forum Bibliographies - Index - Glossaires
    Réponses: 0
    Dernier message: 01/09/2014, 21h44
  2. Les références croisées avec LaTeX
    Par Winnt dans le forum LaTeX
    Réponses: 0
    Dernier message: 01/09/2014, 21h44
  3. Problème de déclaration avec références croisées
    Par lpierard dans le forum Débuter
    Réponses: 2
    Dernier message: 20/11/2009, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo