Est __init__.py pas requis pour les colis en Python 3.3+
Je suis à l'aide de Python 3.5.1. J'ai lu le document et la section de package ici: https://docs.python.org/3/tutorial/modules.html#packages
Maintenant, j'ai la structure suivante:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
Maintenant, alors que dans /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
De la même façon, maintenant dans la maison, superfolder de Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
En fait, je peux faire toutes sortes de choses:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Pourquoi ce travail? Je pensais qu'il fallait être __init__.py
fichiers (vides fonctionne) dans les deux a
et b
pour module.py
être importable lorsque le Python path points à la Playground
dossier?
Cela semble avoir changé de Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Avec __init__.py
dans les deux ~/Playground/a
et ~/Playground/a/b
il fonctionne très bien.
Vous devez vous connecter pour publier un commentaire.
Python 3.3,+ a Implicite De L'Espace De Noms De Paquets qui lui permettent de créer de paquets sans
__init__.py
fichier.À l'ancienne avec
__init__.py
fichiers fonctionne encore comme en Python 2.__init__.py
fichiers de travail en termes d'importations (autre différence entre Python 2 et 3 pas considérés ici).Zen Of Python
ligne 2:Explicit is better than implicit.
....__init__.py
, parfois pas. En Python 3, quand j'ai besoin de ces trucs que j'ai créer un nouveau__init__.py
avec code spécifique, sinon, je n'ai pas. C'est pratique de savoir, visuellement, les packages personnalisés init. Au lieu de python 2, j'ai toujours de placer un__init__.py
(souvent vide), faisant un grand nombre d'entre eux et, enfin, la difficulté à vous rappeler où vous avez placé votre code d'initialisation. Cela devrait aussi correspondre à "Il devrait y avoir un, et de préférence seulement une façon évidente de le faire.".SO
, Apprendre avec les meilleurs! Je comprends Maintenant mieux pourquoi c'est une bonne chose, de revenir à ma déclaration précédente. =) . Merci pour l'aperçu!__init__.py
est utilisé dans tous les cas en Python 3?from .core import *
les importations de tous les noms decore
et ils peuvent être accessibles vianumpy.name
, où " nom " vit en fait dans le 'numpy.de base".IMPORTANT
@Mike réponse est bonne mais trop imprécis. Il est vrai que Python 3.3,+ prend en charge Implicite de l'espace de Noms de Paquets qui permet de créer un package sans
__init__.py
fichier.Cela, cependant, ne s'applique qu'à VIDE
__init__.py
fichiers. Donc VIDE__init__.py
les fichiers ne sont plus nécessaires et peuvent être omis. Si vous souhaitez exécuter un particulier script d'initialisation lorsque le colis ou l'un de ses modules ou sous-packages sont importés, vous avez encore besoin d'un__init__.py
fichier. C'est un grand Un Débordement de pile répondre pour lesquelles vous souhaiteriez utiliser un__init__.py
fichier pour faire plus d'initialisation dans le cas où vous vous demandez pourquoi c'est de toute façon utile.Structure De Répertoire Exemple:
parent_package/child_package/__init__.py
:EXEMPLES
Les exemples ci-dessous montrent comment le script d'initialisation est exécutée lorsque le
child_package
ou un de ses modules est importé.Exemple 1:
Exemple 2:
run_script.py
en même dir queparent_package
, je peux donc il suffit d'importer commefrom parent_package.child_package import child1
sans__init__.py
?child1.py
,child2.py
au lieu de simplement mettre leur code dans__init__
.py directement.__init__
être relatif des importations c'est à direfrom . import child1
? L'absolu importer me donneModuleNotFoundError
(en Python 3.6)__init__.py
est toujours nécessaire, parfois, comme lorsque vous souhaitez consulter un sous-dossier comme un paquet. Par exemple, si je lancepython -m test.foo
cela n'a pas fonctionné jusqu'à ce que j'ai créé un vide__init__.py
sous le dossier test. Et je parle de la version 3.6.6 ici!Si vous avez
setup.py
dans votre projet et que vous utilisezfind_packages()
en son sein, il est nécessaire de disposer d'une__init__.py
de fichiers dans chaque répertoire pour les paquets pour être automatiquement détecté.Docs
__init__.py
vous avez juste à utiliserfind_namespace_packages()
à la place. C'est la très prochaine section dans la page liée: setuptools.readthedocs.io/en/latest/...find_packages()
implique un__init__.py
(si l'on peut utiliserfind_namespace_packages()
sans elle)Je dirais que l'on doit omettre le
__init__.py
seulement si l'on veut avoir la implicite de l'espace de noms de package. Si vous ne savez pas ce que cela signifie, vous ne voulez probablement pas et, par conséquent, vous devez continuer à utiliser le__init__.py
même en Python 3.