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.
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__
.
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é.
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)
Ceci (recherche dans la section "Importations") indique dans l'article officiel que import
s doit normalement être placé en haut de votre fichier source. Je respecterais cette règle, sauf cas particuliers.