2017-01-26 1 views
1

ma question concerne l'écriture de paquets Python (3.x) et de (sous-) modules ainsi que l'utilisation correcte des fichiers __init__.py pour déclarer les espaces de noms.
J'avais l'habitude de coder en C++, donc j'aime utiliser beaucoup de fichiers séparés pour organiser des projets. Par exemple, (imo) si un module contient plusieurs classes, chacune d'elles doit être dans un fichier séparé.Comment utiliser __init__.py dans des (sous-) modules pour définir des espaces de noms?

Comme je suis inexpérimenté en développement en Python, il est difficile de formuler mes pensées dans une question simple. Considérons le petit paquet python suivant à titre d'exemple.

Répertoire layout

dir 
| 
+-- example 
| | 
| +-- script.py 
| 
+-- package 
     | 
     +-- __init__.py 
     | 
     +-- foo.py 
     | 
     +-- subpackage 
      | 
      +-- __init__.py 
      | 
      +-- bar.py 

Jetons un regard sur les fichiers.

Contenu du fichier

package/foo.py:

def foo: 
    print('foo') 

package/subpackage/bar.py:

def bar: 
    print('bar') 

Le example/script.py suivant fonctionne très bien.

import sys 
sys.path.insert(0, '..') 

import package 
import package.subpackage 


package.foo.foo() 
package.subpackage.bar.bar() 

Je n'aime pas utiliser package.foo.foo()/package.subpackage.bar.bar() et je voudrais utiliser package.foo()/package.subpackage.bar().

Et je ne veux pas utiliser from package.subpackage.bar import bar, car je ne veux pas mélanger l'espace de noms de sous-paquetage dans le script.

Solution

J'ai utilisé les fichiers __init__.py pour y parvenir.

package/__init__.py:

from package.foo import foo 

package/subpackage/__init__.py:

from package.subpackage.bar import bar 

Questions

  • Est-ce une bonne façon comme python pour définir les espaces de noms? Ou y a-t-il une meilleure/commune façon d'organiser le système de fichiers d'un paquet en python. (Je n'ai pas trouvé un tutoriel/bon exemple pour cela.)

  • Dans le fichier package/subpackage/__init__.py, pourquoi doit-il être:

    from package.subpackage.bar import bar

    et non:

    ?

Cela se traduirait par l'erreur:

Traceback (most recent call last): 
File "script.py", line x, in <module> 
import package.subpackage 
File "..\package\subpackage\__init__.py", line x, in <module> 
from subpackage.bar import bar 
ImportError: No module named 'subpackage' 

Répondre

4

Is this a good python-like way to define namespaces? Or is there a better/common way to organize the file-system of a package in python. (I did not find a proper tutorial/example for this.)

Ceci est un moyen de configurer bien un paquet Python. Seulement ok et pas «bon» en raison du contenu de foo.py et bar.py.

I don't like to use package.foo.foo()/package.subpackage.bar.bar() and would like to use package.foo()/package.subpackage.bar() .

Dans ce cas, vous ne pouvez pas. Et ne pas mélanger les espaces de nom est une bonne raison de ne pas faire from package.subpackage.bar import bar.

Il aurait été mieux si def foo(): ... et def bar(): ... étaient directement dans __init__.py. De cette façon, vous auriez pu faire package.foo() et package.subpackage.bar(). Cela aurait également pu être fait en utilisant __all__ dans init mais import * n'est pas non plus considéré comme bon.

Ou, les foo et bar paquets auraient dû avoir plus comme foo.function1, foo.other_func, bar.drink, etc. ce qui lui donne l'organisation compréhensible plus convivial humaine.

exemples et les références ne sont pas dans la portée de bonnes questions stackoverflow mais voici, pour une question bien pensé:

+0

Merci pour ta réponse. Fondamentalement, votre deuxième lien ("La façon Pythonic ...") est la question StackOverflow que je cherchais. Je n'aime pas l'idée de "jeter une tonne de code" dans un seul fichier comme le dit l'auteur. Mais comme Python considère les fichiers comme des modules, il semble qu'il n'y ait pas de bonne solution. J'ai eu l'idée d'éditer les fichiers '__init __. Py' [ici] (https://www.blog.pythonlibrary.org/2012/07/08/python-201-creating-modules-and-packages/) . –