Qu'est-ce qu'un . dans une instruction d'importation en Python signifie?

141

Je regarde le code du multiprocessingmodule de Python , et il contient cette ligne:

from ._multiprocessing import win32, Connection, PipeConnection

au lieu de

from _multiprocessing import win32, Connection, PipeConnection

la différence subtile étant la période précédente _multiprocessing. Qu'est-ce que ça veut dire? Pourquoi cette période?

Vlad l'Impala
la source
3
Cela s'appelle l'importation relative: docs.python.org/tutorial/modules.html
Aillyn
Sans le ., si vous aviez un fichier _multiprocessing.pypour une raison indéchiffrable à côté de votre script principal, il multiprocessingse briserait. Avec le ., il s'assure de disposer de son propre module.
Chris Morgan le
Si a .fait référence à des modules homologues, pourquoi la documentation dirait-elle d'utiliser a .alors que ce module multiprocesseur devrait faire partie des bibliothèques sys.path régulières? La question et la clarification de Chris les confondent-elles ou est-ce que je ne comprends pas? Appréciez l'aide.
rfii le

Réponses:

120

C'est la nouvelle syntaxe pour les importations relatives explicites . Cela signifie importer depuis le package actuel.

Keith
la source
26
Qu'est-ce qui définit ce qu'est le «package actuel»?
fraxture
7
Il devrait indiquer d'où provient le package d'importation . Cela signifie essentiellement l'espace de noms actuel ou le répertoire du package.
Keith
2
Merci, je pense que je sais ce que tu veux dire. Pour être clair, pourriez-vous donner un exemple?
fraxture
11
Vous pouvez faire des choses comme:from . import peermodule from .. import parentpackagemodule
Keith
2
@bmc Une bonne façon d'apprendre est de mettre en place une petite expérience et de l'essayer vous-même. ;-)
Keith
22

Le point dans le nom du module est utilisé pour l'importation relative du module (voir ici et ici , section 6.4.2).

Vous pouvez utiliser plusieurs points, ne faisant pas référence au package actuel mais à ses parents. Cela ne doit être utilisé que dans les packages, dans le module principal, il faut toujours utiliser des noms de module absolus.

Martin Gunia
la source