2017-04-06 8 views
0

ファイルからすべてのメソッドをインポートして、パッケージとして使用する際に問題が発生しました。Pythonパッケージからメソッドをインポートする

myapp.py 
mypackage/ 
mypackage/__init__.py 
mypackage/mypackage.py 

mypackage.pyの内部Iがmethod1()method2()を持っている:私は、次があります。 myapp.pyの中で私はこれをしたい:

import mypackage 
mypackage.method1() 

これは動作しません。代わりに私はmypackage.mypackage.method1()をする必要があり、私はそれを修正するために何をすべきか分からない。私が見つけた唯一の方法は、__init__.pyを削除し、mypackage.py__init__.pyに改名することです。これは正しくないようです。

すべてのメソッドをインポートするためにinitファイルに入れる必要があるので、パッケージ名を2回入力する必要はありません。

+1

なぜそうは思わしくないのですか? 'mypackage'に2つのメソッドしかない場合は、' __init __。py'でそれらを定義するのはなぜですか?あるいは単にディレクトリを 'mypackage.py'で置き換えて、そこに書き込んでください。あなたのモジュールのディレクトリのオーバーヘッドは必要ありません。あるいは、それらを '__init __。py'に' import 'してください。 – jonrsharpe

+0

これは単なる例であり、私は2以上の数を持っています。将来的には、より多くのファイルを組織化したい場合があります。私の質問は、 '__init __。py'でそれらをインポートする方法です。個々のファイル名を指定する必要はありませんか?私は 'から試しました。 import * 'と' import mypackage'を実行しますが、 'mypackage.method1()'を実行することはできません。そして、私はフォルダがより良いとは思わないが、ピピはそれをサポートしていないようだ。 – Dendory

+0

'.mypackage import *'から?また:* "将来的に私は"あなたがYAGNIを読むべきであることを示唆しているかもしれません!シンプルなバージョンから始め、複雑になったら*実際に*する必要があることを発見したとき。 – jonrsharpe

答えて

0

この例では、パッケージにmypackageパッケージ(__init__.pyのディレクトリ)とmypackageモジュールがあります。コースのストローマンの例を投稿したばかりですが、モジュールをパッケージと同じ名前にすると、インポートミスを招く危険性があります。そして、パッケージ以外のものを「パッケージ」と呼ぶことは、確かに紛らわしいものです!

mypackagemypackage.pyからメソッドを取得するには、 mypackage/__init__.pyにパッケージ相対インポートを行うことができます。

from .mypackage import method1, method2 

...または

from .mypackage import * 

あなたが何か他のものにmypackage.pyの名前を変更する必要があります理由をそのドットを紛失するような小さな間違いが、間違ったものをインポートする原因になります。

関連する問題