2017-01-26 5 views
1

私の質問は、Python(3.x)パッケージと(サブ)モジュールを書くことと、__init__.pyファイルを正しく使って名前空間を宣言することです。
私はC++でコーディングしていましたので、プロジェクトを編成するためにたくさんの別々のファイルを使いたいと思います。たとえば、(imo)モジュールに複数のクラスが含まれている場合、これらのクラスはそれぞれ別のファイルに存在する必要があります。(サブ)モジュールで__init__.pyを使用して名前空間を定義する方法?

私はPythonでの開発に慣れていないので、私の考えを簡単な質問で策定することは難しいです。 次に、小さなpythonパッケージを例として考えてみましょう。

ディレクトリレイアウト

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

のファイルを見てみましょう。

package/foo.pyファイル内容:

def foo: 
    print('foo') 

package/subpackage/bar.pyは:

def bar: 
    print('bar') 

example/script.pyが正常に動作します。

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

import package 
import package.subpackage 


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

私はpackage.foo.foo()/package.subpackage.bar.bar()を使用することを好きではないとpackage.foo()/package.subpackage.bar()を使用したいと思います。

from package.subpackage.bar import barを使用したくありません。サブパッケージの名前空間をスクリプトに混ぜる必要はありません。

ソリューションは、私はそれを達成するために__init__.pyファイルを使用していました。

package/__init__.py

from package.foo import foo 

package/subpackage/__init__.py

from package.subpackage.bar import bar 

質問

  • これは、名前空間を定義するのは良いのpython-ような方法は何ですか?あるいは、Pythonでパッケージのファイルシステムを整理するためのより良い/共通の方法があります。 (私はこれのために適切なチュートリアル/例を見つけることができませんでした。)ファイルpackage/subpackage/__init__.py

  • は、なぜそれがあることを持っています:

    from package.subpackage.bar import bar

    ない:

    を?

これはエラーになり:

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' 

答えて

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.)

これは、セットアップPythonパッケージへ大丈夫方法です。 foo.pybar.pyの内容のため、のみが、ではなく「良好」ではありません。

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

この場合、できません。名前空間を混在させないと、from package.subpackage.bar import barを実行しないとよい理由です。

def foo(): ...def bar(): ...が直接__init__.pyであった方が良いでしょう。そうすれば、package.foo()package.subpackage.bar()を実行できました。また、initで__all__を使用することで完了した可能性もありますが、import *も良いとはみなされません。

あるいは、foobarパッケージはそれより人に優しい理解できる組織を与えるなどfoo.function1foo.other_funcbar.drink、のようなことでより多くを持っている必要があります。

+0

ありがとう:考え抜かれた質問に対して、

例と参照が良いStackOverflowの質問のための範囲内ではありませんが、ここでいくつか紹介しますあなたの答えです。 基本的には、2番目のリンク(「Pythonの方法...」)は、私が探していたStackOverflowの質問です。 著者が言うように、私は「1トンのコードを投げつける」という考え方を1つのファイルに入れるのが好きではありません。しかし、Pythonはファイルをモジュールとして見ているので、良い解決策はないようです。 私は '__init __。py'-files [ここ](https://www.blog.pythonlibrary.org/2012/07/08/python-201-creating-modules-and-packages/)の編集を考えています。 。 –

関連する問題