2010-03-17 9 views
1

J'ai un fichier, myfile.py, qui importe Class1 de file.py et file.py contient des importations à des classes différentes dans file2.py, file3.py, file4.py.Python importation

Dans mes myfile.py, puis-je accéder à ces classes ou dois-je à nouveau importer file2.py, file3.py, etc.?

Est-ce que Python ajoute automatiquement toutes les importations incluses dans le fichier que j'ai importé, puis-je les utiliser automatiquement?

+0

Qu'est-ce qui vous a motivé à poser cette question? –

+0

J'ai ce code opensource, j'ai téléchargé. Ils font quelque chose comme ça. J'ai travaillé avec Java et je sais que ce n'est pas possible en Java. Tellement confus et demandé. – Boolean

Répondre

8

La meilleure pratique consiste à importer chaque module qui définit les identificateurs dont vous avez besoin, et d'utiliser ces identifiants comme qualifié par le nom du module; Je recommande d'utiliser from uniquement lorsque vous importez un module à partir d'un package. La question a souvent été discutée sur SO.

Importation d'un module, dire moda, de nombreux modules (par exemple modb, modc, modd, ...) qui ont besoin d'un ou plusieurs des identifiants moda définit, ne vous ralentit pas: bytecode de moda est chargé (et éventuellement construire à partir de ses sources, si nécessaire) qu'une seule fois, la première fois moda est importé n'importe où, alors toutes les autres importations du module utilisent un chemin rapide impliquant un cache (un nom de module de mappage des objets module accessible par sys.modules dans cas de besoin ... si vous d'abord import sys, bien sûr! -).

1

Python n'introduit pas automatiquement quelque chose dans l'espace de noms de myfile.py, mais vous pouvez accéder à tout ce qui se trouve dans les espaces de noms de tous les autres modules.

Ce qui veut dire, si vous avez file1.py from file2 import SomeClass et myfile.py vous a fait import file1, vous pouvez y accéder à l'intérieur comme mon_fichier file1.SomeClass. Si dans fichier1.py vous avez fait import file2 et dans myfile.py vous avez fait import file1, alors vous pouvez accéder à la classe depuis mon fichier en tant que file1.file2.SomeClass. (Ce ne sont généralement pas les meilleurs moyens de le faire, en particulier pas le deuxième exemple.)

Ceci est facilement testé.

+4

Mais s'il vous plaît, s'il vous plaît, s'il vous plaît ne faites pas cela. Importez explicitement tous les modules dont votre code aura besoin. –

+0

Oui et non. Selon la façon dont file1.py est supposé fonctionner, il se peut que ce soit le bon endroit pour accéder à 'SomeClass'. (Ce dernier exemple est toujours de mauvaise forme.) –

0

Dans le module myfile, vous pouvez soit faire from file import ClassFromFile2 ou from file2 import ClassFromFile2 pour accéder à ClassFromFile2, en supposant que la classe est également importée dans le fichier.

Cette technique est souvent utilisée pour simplifier un peu l'API. Par exemple, un module db.py peut importer diverses choses à partir des modules mysqldb, sqlalchemy et d'autres helpers. Tout est accessible via le module db.

0

Si vous utilisez une importation générique, oui, l'importation générique est en fait la manière de créer de nouveaux alias dans votre espace de noms actuel pour le contenu du module importé. Si ce n'est pas le cas, vous devez utiliser l'espace de noms du module que vous avez importé comme d'habitude.

+0

Bien sûr, vous ne devriez jamais utiliser 'import *'. –