ホームページ  >  記事  >  バックエンド開発  >  Python モジュールとパッケージの名前が重複する場合の解決策

Python モジュールとパッケージの名前が重複する場合の解決策

Y2J
Y2Jオリジナル
2017-05-13 13:43:299295ブラウズ

この記事では主に、Python で同じ名前のモジュールとパッケージを扱う方法を紹介します。記事内の紹介は非常に詳細であり、必要な方は以下を参照してください。

はじめに

プログラミング開発においては、仕様書を守っていれば問題は少ないと個人的に感じています。初めてテクノロジーを学び始めると、確かに多くの落とし穴に遭遇するでしょう。より多くの落とし穴を踏むことは良いことです。より多くのことを学び、問題を避けるためにルールが定められていることに従うことの重要性をますます感じます。時には、自分のやり方で進めず、経験豊富な人のアドバイスに耳を傾けるべきです。これはこの記事の焦点では​​ないようです。実際、私の焦点は、多くの回り道を避けるために、基準に従って物事を行うよう最善を尽くすべきであるということを表現することです。私が現在主に使用している

プログラミング言語

は、Pythonに触れてから今のところ落とし穴に遭遇したことがほとんどなく、基本的に変な問題に遭遇したことがないように感じています。実際、これは良いことではなく、穴に足を踏み入れないと、暗闇に眠っている多くの知識が理解できないため、成長するのが難しくなります。幸いなことに、罠に入る方法を知っている同僚が何人かいます。 同僚がPythonで、モジュールとパッケージが同じ名前の場合、パッケージのみをインポートできますか、モジュールをインポートしたい場合はどうすればよいですか?と質問しました。おそらく彼が言いたいのは、プロジェクトの同じレベルのディレクトリに foo.py ファイルと foo/ ディレクトリがあり、 import foo がインポートされると、foo.py の内容の代わりに foo/ の内容がインポートされるということです。 。

この質問をされたとき、私が最初に感じたのは、明らかに曖昧さでした。私だったら、モジュール名とパッケージ名が同じになるようには絶対に設計しません。本質的に、インポート時に誰をインポートするかを区別する方法がないからです。この場合、例えばシステムに特別な規定がない限り、パッケージのみを輸入できると規定されている。

私は無意識のうちに、ここでエラーを報告する必要があると考えています。Python インタプリタは誰をインポートすべきかを知りません。ただし、同僚は、他の人のコードはこのように書かれており、この場合、パッケージはデフォルトでインポートされると教えてくれました。それは可能であり、インタプリタはこの場合、パッケージが常にインポートされるように規定しています。

これを検証するために、次のプロジェクト構造を持つ簡単なプロジェクトを作成しました:

.
├── main.py
└── same
 ├── api
 │ └── init.py
 ├── auth
 │ └── init.py
 ├── auth.py
 └── init.py

その内:

same/api/init/py 内容:


from .. import auth

Same/auth/init.py コンテンツ:


auth_str = "This is str in package!"

same/auth.py コンテンツ:


auth_str = "This is str in module!"

main.py コンテンツ:

from future import print_function

from same.api import auth

# Script starts from here

if name == "main":
 print(auth.auth_str)

少し複雑です、笑、主な理由は、私の同僚の一般的な構造は次のようなものですが、ここではより良いシミュレーションのために示しています。 same.auth パッケージで auth_str 文字列

と、同じ名前の auth_str 文字列が同じ名前の same.auth モジュールで定義されており、同じ名前で auth をインポートしようとします。 API パッケージを作成し、最後に main.py で Same.api.auth.auth_str を出力して、どの文字列が出力されるかを確認しようとします。同時に、Python2 と Python3 で main.py を実行しようとしました。得られた結果は次のとおりです:

same.auth 包中定义了一个 auth_str 字符串,又在同名的 same.auth 模块中定义了一个同名的 auth_str 字符串,然后在 same.api 包尝试导入 auth,最后在 main.py 尝试输出 same.api.auth.auth_str

This is str in package!

これにより、私たちの推測が正しいことが確認され、インタープリターはパッケージの内容のみをインポートしました。ただし、これが事実であるという公式情報があるかどうかはわかりませんので、これが単なる偶然であるかどうかはわかりません。

そこで、この結論を検証するために情報を調べ始めました。正直に言うと、想像もできないほど英語が苦手な私には、まず Baidu で答えを探すしかありません。実際のところ、Baidu を使用するのは残念なことが多いです。しばらくして無駄になりましたが、仕方なく英語で検索してみました。そこで、stackoverflow で次の質問を見つけました:

同じ名前のモジュールとパッケージを Python はどのように処理しますか?

ある人は、Python の公式ドキュメントでモジュール検索パス docs.python を説明していると答えました。 /3/tutorial/modules.html#the-module-search-path.

このドキュメントには次の説明があります:

初期化後、Python プログラムは sys.path を変更できます。実行中のスクリプトを含むディレクトリは、これは、ライブラリ ディレクトリ内の同じ名前のモジュールの代わりに、そのディレクトリ内のスクリプトがロードされることを意味します。置換が意図されていない限り、これはエラーです。「標準モジュール」のセクションを参照してください。詳細については、


つまり、ライブラリの検索パスでディレクトリが最初に検索されます。これは、同じ名前のモジュールの代わりにディレクトリがロードされることを意味します。

前回の結論が確認できて、ようやく安心しました。 Python では、同じ名前のモジュールとパッケージをインポートしようとすると、パッケージがインポートされます。この場合、モジュールをインポートしたい場合は、いくつかの「ハック」メソッドを使用する必要がある場合があります。上記の stackoverflow の投稿にいくつかの例があります。もちろん、最善の方法は、そのようなデザインを避けることです。そうすれば、情報の検索にそれほど長い時間を費やしたり、この記事と同様の記事を書くのにそれほど時間を費やすことがなくなります。

概要

[関連推奨事項]

1. 特別な推奨事項: 「phpプログラマツールボックス」V0.1バージョンのダウンロード

2. パイソン無料のビデオチュートリアル

3. Python オブジェクト指向のビデオチュートリアル

以上がPython モジュールとパッケージの名前が重複する場合の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。