2 votes

Python 3+ importer un package dans un appel de fonction?

Au fil du temps, j'ai constitué une collection de fonctions utilitaires pour diverses choses.

J'aimerais les mettre toutes dans un package, avec une structure un peu plus élaborée qu'un simple fichier contenant toutes les fonctions.

Certaines de ces fonctions sont écrites en supposant que certains packages ont été importés, par exemple j'ai plusieurs fonctions utilitaires pour numpy et pandas qui supposent quelque chose comme import numpy as np

Évidemment je n'utiliserai pas ce package hypothétique comme from import * mais je ne veux pas non plus nuire aux performances.

Donc si j'ai une fonction utilitaire numpy, devrais-je ajouter ceci à chaque fonction

# mypkg.np.utils
import sys

def np_util_fn(...):
    if 'np' not in sys.modules: import numpy as np
    # rest of func

ou

# mypkg.np.utils
import sys
if 'np' not in sys.modules: import numpy as np    

def np_util_fn(...):
    # rest of func

quel est le plus performant si j'utilise une autre partie de ce package? par exemple from pkg.other.utils import fn

3voto

quant Points 1617

D'accord, analysons votre problème. Supposons que vous ayez un fichier module.py:

print("Le module a été importé")

et un fichier test.py avec:

import module
import module

. Si vous exécutez maintenant test.py, vous obtiendrez

Le module a été importé

. Veuillez noter que cette ligne n'est pas affichée deux fois. Cela signifie que Python vérifie déjà si un module a déjà été importé (avant de le réimporter). Donc votre vérification if 'np' not in sys.modules: import numpy as np n'est pas nécessaire. Cette vérification ne fait que retarder les choses car cela peut entraîner une double vérification.

Si vous souhaitez réimporter un module, vous avez besoin de reload(module). Donc si vous avez

import module
import module
reload(module)

dans code.py vous verrez la ligne Le module a été importé deux fois.

Cela signifie que

import numpy as np

est suffisant. Il n'est pas nécessaire de vérifier s'il a déjà été importé via:

if 'np' not in sys.modules: import numpy as np

Cela dépend s'il est avantageux de faire import numpy as np au tout début de votre script ou dans une fonction. Si la fonction est exécutée plusieurs fois, il est avantageux de le faire uniquement au tout début. Sinon, vous vérifiez constamment si 'np' n'est pas dans sys.modules. En revanche, si vous pouvez argumenter que votre fonction n'est pas appelée trop souvent / n'est pas nécessairement exécutée dans votre programme (par exemple, car elle dépend de l'entrée utilisateur), alors il peut être avantageux (vu du "point de vue" de la vitesse) d'importer ce module uniquement dans une fonction.

Je n'utilise généralement pas d'instructions import dans les fonctions car j'ai toujours l'impression qu'elles alourdissent le corps de la fonction et réduisent ainsi la lisibilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X