J'ai adopté la pratique de mettre toutes les importations dans les fonctions qui les utilisent, plutôt qu'en haut du module.
Le bénéfice que j'en retire est la possibilité de refactorer de manière plus fiable. Lorsque je déplace une fonction d'un module à un autre, je sais que la fonction continuera à fonctionner avec tout son héritage de tests intact. Si mes importations se trouvent en haut du module, lorsque je déplace une fonction, je passe beaucoup de temps à faire en sorte que les importations du nouveau module soient complètes et minimales. Un IDE de refactoring pourrait rendre cela inutile.
Il y a une pénalité de vitesse comme mentionné ailleurs. Je l'ai mesurée dans mon application et je l'ai trouvée insignifiante pour mes besoins.
Il est également agréable de pouvoir voir toutes les dépendances des modules sans avoir à recourir à la recherche (par exemple, grep). Cependant, la raison pour laquelle je m'intéresse aux dépendances des modules est généralement parce que j'installe, remanie ou déplace un système entier comprenant plusieurs fichiers, et pas seulement un seul module. Dans ce cas, je vais de toute façon effectuer une recherche globale pour m'assurer que je dispose des dépendances au niveau du système. Je n'ai donc pas trouvé que les importations globales m'aident à comprendre un système dans la pratique.
Je mets habituellement l'importation de sys
à l'intérieur de la if __name__=='__main__'
et ensuite passer des arguments (comme sys.argv[1:]
) à un main()
fonction. Cela me permet d'utiliser main
dans un contexte où sys
n'a pas été importé.