web-dev-qa-db-fra.com

Importation de modules dans une classe python

J'écris actuellement une classe qui nécessite os, stat et quelques autres.

Quelle est la meilleure façon d'importer ces modules dans ma classe?

Je pense au moment où les autres l'utiliseront, je veux que les modules 'dépendances' soient déjà importés Lorsque la classe est instanciée.

Maintenant, je les importe dans mes méthodes, mais il existe peut-être une meilleure solution.

41
Paul

Si votre module importera toujours un autre module, mettez-le toujours en haut de la manière indiquée par PEP 8 et les autres réponses l'indiquent. De plus, comme @delnan le mentionne dans un commentaire, sys, os, etc. sont utilisés de toute façon, il n'est donc pas gênant de les importer globalement.

Cependant, il n'y a rien de mal avec les importations conditionnelles, si vous avez vraiment besoin d'un module uniquement dans certaines conditions d'exécution.

Si vous souhaitez uniquement les importer si la classe est define, comme si la classe se trouvait dans un bloc conditionnel ou dans une autre classe ou méthode, vous pouvez procéder comme suit:

condition = True

if condition:
    class C(object):
        os = __import__('os')
        def __init__(self):
            print self.os.listdir

    C.os
    c = C()

Si vous souhaitez que cette classe ne soit importée que si la classe est instanciée, faites-la dans __new__ ou __init__.

39
agf

PPE 8 sur les importations:

Les importations sont toujours placées en haut du fichier, juste après n'importe quel module commentaires et docstrings, et avant les globales et les constantes du module.

Cela facilite la visualisation de tous les modules utilisés par le fichier actuel et évite de devoir répliquer l'importation à plusieurs endroits lorsqu'un module est utilisé à plusieurs endroits. Tout le reste (par exemple les importations au niveau fonction/méthode) doit constituer une exception absolue et doit être bien justifié. 

10
user395760
import sys
from importlib import import_module

class Foo():

    def __init__(self):

        if self.condition:
            self.importedModule = import_module('moduleName')

        if 'moduleName' in sys.modules:
            self.importedModule.callFunction(params)

        #or

        if self.condition:
            self.importedModule.callFunction(params)
5
nvd

Ceci (recherche dans la section "Importations") indique dans l'article officiel que imports doit normalement être placé en haut de votre fichier source. Je respecterais cette règle, sauf cas particuliers.

0
Constantinius