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 :

syntaxe python : import d'un module dans une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut syntaxe python : import d'un module dans une fonction
    bonjour à tous,

    Alors voilà je suis entrain d'étudier un programme sous Github afin d'en extraire une partie qui devrait me servir dans un projet que je suis entrain de commencer.

    En explorant les différents fichiers je tombe souvent sur ce genre d'écritures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        def build_dataframe(self):
            """exports the object to pandas format"""
            import pandas as pd
            matrix = self.data
            if matrix is None:
                return
            if isinstance(matrix, coo_matrix):
                data = {'row': matrix.row, 'col': matrix.col, 'data' : matrix.data}
                data_frame = pd.DataFrame(data=data).reindex(columns=['row', 'col', 'data'])
            elif isinstance(matrix, np.ndarray):
                data_frame = pd.DataFrame(data=matrix)
            else:
                raise NotImplementedError(type(matrix))
            self.data_frame = data_frame
     
        def write(self, mat, print_full=True):
            """writes to the F06"""
            mat.write(np.compat.asbytes(str(self) + '\n'))
     
            matrix = self.data
            if self.data is None:
                mat.write('skipping %s because data is None\n\n' % self.name)
                return
            if isinstance(matrix, coo_matrix):
                if print_full:
                    for row, col, value in zip(matrix.row, matrix.col, matrix.data):
                        mat.write(np.compat.asbytes("(%i, %i) %s\n" % (row, col, value)))
                else:
                    mat.write(str(matrix))
            else:
                mat.write(np.compat.asbytes('name=%r; shape=%s; form=%i; Type=%r\n' % (
                    self.name, str(self.data.shape).replace('L', ''),
                    self.form, self.shape_str)))
                if print_full:
                    np.savetxt(mat, self.data, fmt='%.18e', delimiter=',')
                #f06.write(str(matrix))
                #print('WARNING: matrix type=%s does not support writing' % type(matrix))
            mat.write(np.compat.asbytes('\n\n'))
    Alors ce qui me chagrine un peu c'est cette partie : l'import du module pandas dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def build_dataframe(self):
            """exports the object to pandas format"""
            import pandas as pd
    Est il commode d'écrire de la sorte ? Je trouve tout de même très peu lisible le code même s'il est très commenté, mais importer des modules dans des fonctions ou alors en y insérant des conditions du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if toto == None :
        import titi
    Est ce qu'il y a un intérêt dans ce genre de structures ?

    Le premier intérêt que je vois c'est éviter d'importer un module si on en a pas vraiment besoin et ainsi gagner du temps dans l’exécution du programme.

    Merci d'avance pour vos retours.

    Pour ceux qui sont intéresse par le projet sous Github voici le lien : pyNastran

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    Alors ce qui me chagrine un peu c'est cette partie : l'import du module pandas dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def build_dataframe(self):
            """exports the object to pandas format"""
            import pandas as pd
    Est il commode d'écrire de la sorte ? Je trouve tout de même très peu lisible le code même s'il est très commenté, mais importer des modules dans des fonctions
    Dans la pratique, import pandas as pd importe le module (mais seulement au premier "import") et définit la variable "pd". Donc la fonction ne fait que s'assurer que la variable "pd" est bien associée au module pandas... Ce qui n'est pas bien méchant. Après, il faut demander au développeur pourquoi il n'a pas poussé cet import dans le début du module. Il vous expliquera probablement que "c'est historique" et que ce "change" est assez bas dans la liste des priorités.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour et bonne année.

    Ton exemple vient du fichier pyNastran/pyNastran/op2/tables/matrix.py.
    Extrait du code du dernier commit (20 novembre 2018) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    """Defines the Matrix class"""
    from __future__ import print_function
     
    from scipy.sparse import coo_matrix  # type: ignore
    import numpy as np
    from pyNastran.op2.op2_interface.write_utils import export_to_hdf5
    from pyNastran.utils import object_attributes, object_methods, unicode_type
     
     
     
    class Matrix(object):
        [...]
     
        def build_dataframe(self):
            """exports the object to pandas format"""
            import pandas as pd
            matrix = self.data
            if matrix is None:
                return
            if isinstance(matrix, coo_matrix):
                data = {'row': matrix.row, 'col': matrix.col, 'data' : matrix.data}
                data_frame = pd.DataFrame(data=data).reindex(columns=['row', 'col', 'data'])
            elif isinstance(matrix, np.ndarray):
                data_frame = pd.DataFrame(data=matrix)
            else:
                raise NotImplementedError(type(matrix))
            self.data_frame = data_frame
     
        [...]
    Mais considérons aussi le fichier similaire pyNastran/pyNastran/dev/op2_reader/tables/matrix.py.
    Extrait du code du dernier commit (13 août 2018) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    """Defines the Matrix class"""
    from __future__ import print_function
    from scipy.sparse import coo_matrix  # type: ignore
    import numpy as np
    from pyNastran.op2.op2_interface.write_utils import export_to_hdf5
    from pyNastran.utils import object_attributes, object_methods
    try:
        import pandas as pd  # type: ignore
    except ImportError:
        pass
     
    #from pyNastran.utils import object_attributes
     
     
    class Matrix(object):
        [...]
     
        def build_dataframe(self):
            """exports the object to pandas format"""
            matrix = self.data
            if matrix is None:
                return
            if isinstance(matrix, coo_matrix):
                data = {'row': matrix.row, 'col': matrix.col, 'data' : matrix.data}
                data_frame = pd.DataFrame(data=data).reindex(columns=['row', 'col', 'data'])
            elif isinstance(matrix, np.ndarray):
                data_frame = pd.DataFrame(data=matrix)
            else:
                raise NotImplementedError(type(matrix))
            self.data_frame = data_frame
     
        [...]
    Le except ImportError permet de voir que le module pandas est optionnel.

    Dans chacun de ces deux fichiers, seule la méthode build_dataframe de Matrix utilise le module pandas. Pour gérer cela, l'auteur a utilisé deux stratégies différentes.

    Dans le fichier du 20 novembre 2018, contrairement à celui du 13 août 2018, on voit mieux que la méthode build_dataframe de Matrix utilise le module pandas, car l'import se trouve au début du code de cette méthode. Par contre, on voit moins bien que le module matrix dépend en partie du module pandas, car ce dernier n'apparaît pas en haut du fichier.

    Cela dit, dans les deux cas, je pense qu'il y a un problème d'architecture. Si on veut que le module pandas soit optionnel, alors il aurait été mieux de faire d'un côté des modules qui ne contiennent que du code qui ne nécessite pas pandas et de l'autre des modules dont toutes (ou presque toutes) les fonctions nécessitent directement ou indirectement pandas. Les dépendances auraient alors été plus claires que quand on mélange tout.

Discussions similaires

  1. Importer valeur requete SQL dans une Requete
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/03/2006, 14h24
  2. Exécuter une sub d'un module dans une macro
    Par pnoel-bi dans le forum Access
    Réponses: 3
    Dernier message: 03/03/2006, 10h39
  3. Import de Données Excel dans une Table Access
    Par YLF dans le forum Access
    Réponses: 2
    Dernier message: 20/02/2006, 19h02
  4. Comment importer un document CSV dans une table MySql ?
    Par magic8392 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/02/2005, 11h03
  5. Syntaxe pour avoir un seul resultat dans une requete
    Par Pompil dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/09/2003, 15h51

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