web-dev-qa-db-fra.com

Déclaration d'importation dans la définition de classe/fonction - est-ce une bonne idée?

J'ai créé un module nommé util qui fournit des classes et des fonctions que j'utilise souvent en Python . Certains nécessitent des fonctionnalités importées. Quels sont les avantages et les inconvénients de l'importation d'éléments nécessaires dans la définition de classe/fonction? Est-il préférable que import au début d'un fichier de module? Est-ce que c'est une bonne idée?

40
Maciej Ziarko

C'est le style le plus courant pour placer every import en haut du fichier. PEP 8 le recommande, ce qui est une bonne raison de le faire pour commencer. Mais ce n'est pas un caprice, cela a des avantages (bien que pas assez critique pour faire de tout le reste un crime). Il permet de rechercher toutes les importations en un coup d'œil, au lieu de parcourir l'intégralité du fichier. Cela garantit également que tout est importé avant tout autre code (qui peut dépendre de certaines importations) est exécuté. NameErrors sont généralement faciles à résoudre, mais ils peuvent être agaçants.

Il n'y a pas de pollution (significative) des espaces de noms à éviter en gardant le module dans une portée plus petite, car vous ajoutez uniquement le module actuel ( non, import * ne compte pas et ne devrait probablement pas être utilisé de toute façon ). Dans les fonctions internes, vous importez à nouveau à chaque appel (ce qui n’est pas vraiment dommageable, car tout est importé une fois, mais il n’est pas appelé).

44
user395760

PEP8 , le guide de style Python, stipule que:

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

Bien sûr, ce n’est pas une règle absolue, et les importations peuvent aller où vous le souhaitez. Mais les placer au sommet est la meilleure façon de s'y prendre. Vous pouvez bien sûr importer dans des fonctions ou une classe.

Mais notez que vous ne pouvez pas faire ceci:

def foo():
    from os import *

Parce que:

SyntaxWarning: import * only allowed at module level
12
user225312

Alors que les autres réponses sont généralement correctes, il y a une raison pour laquelle python le permet.

Il n’est pas judicieux d’importer des éléments redondants qui ne sont pas nécessaires. Donc, si vous voulez par exemple analyser XML dans une arborescence d’éléments, mais ne souhaitez pas utiliser l’analyseur XML intégré lent si lxml est disponible, vous devez le vérifier au moment où vous avez besoin d’appeler l’analyseur.

Et au lieu de mémoriser la disponibilité de lxml au début, je préférerais que try importe et utilise lxml, except n’est pas là, auquel cas je reviendrais au module intégré xml.

2
flying sheep

Tout comme la réponse de mouton volant, je conviens que les autres ont raison, mais je mets des importations à d’autres endroits, comme dans les routines __init__() et les appels de fonction lorsque je développe du code. Une fois que ma classe ou fonction a été testée et éprouvée pour fonctionner avec l'importation à l'intérieur de celle-ci, je lui donne normalement son propre module avec l'importation conformément aux directives PEP8. Je le fais parce que parfois j'oublie de supprimer les importations après le refactoring du code ou la suppression de l'ancien code contenant de mauvaises idées. En conservant les importations dans la classe ou la fonction en cours de développement, je spécifie ses dépendances si je souhaite le copier ailleurs ou le promouvoir dans son propre module ...

2
Will Charlton

Je crois que la meilleure pratique (selon certains PEP) est de conserver les déclarations d'importation au début d'un module. Vous pouvez ajouter des instructions d'importation à un fichier __init__.py, ce qui importera ces modules dans tous les modules du package.

Donc… c'est certainement quelque chose que vous pouvez faire comme vous le faites, mais c'est découragé et en fait inutile.

2
Ramy

Ne déplacez les importations dans une étendue locale, telle que dans une définition de fonction, s'il est nécessaire de résoudre un problème tel que d'éviter une importation circulaire ou si vous essayez de réduire le temps d'initialisation d'un module. Cette technique est particulièrement utile si de nombreuses importations sont inutiles en fonction de l'exécution du programme. Vous pouvez également vouloir déplacer des importations dans une fonction si les modules ne sont utilisés que dans cette fonction. Notez que le chargement d'un module la première fois peut être coûteux en raison de son initialisation unique, mais que le chargement d'un module à plusieurs reprises est pratiquement gratuit, ne nécessitant que quelques recherches dans le dictionnaire. Même si le nom du module est hors de portée, il est probablement disponible dans sys.modules.

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

0
N.Y