web-dev-qa-db-ja.com

Pythonパッケージ名の規則

PythonのようにJavaのcom.company.actualpackageのようなパッケージ命名規則はありますか?ほとんどの場合、 " web "のような単純で衝突する可能性のあるパッケージ名が表示されます。

そのような慣習がない場合、その理由はありますか? Java世界でPython命名規則を使用することについてどう思いますか?

50
deamon

Pythonには、このトピックをカバーする2つの「マントラ」があります。

明示的は暗黙的よりも優れています。

そして

名前空間は非常に魅力的なアイデアの1つです。もっと多くのことをしましょう!

The Python Style Guide (PEP 8)にあるモジュールの命名とインポートに関する規則があります。

Javaスタイルでモジュール名に一貫してプレフィックスを付けるためのそのような規則がないことの最大の理由は、時間が経つにつれて、本当に必要のないコードで多くの繰り返しが発生するためですそこにいる。

Javaの問題の1つは、常に自分自身を繰り返すことを強制することです。Javaコードに必要でないコードがたくさんあります。 Pythonで(ゲッター/セッターはその代表的な例です。)

Python)では、名前空間はそれほど問題ではありません。インポート時にモジュールにエイリアスを与えることができるからです。

import com.company.actualpackage as shortername

したがって、プログラム内で名前空間を作成または操作できるだけでなく、独自のキーストローク節約エイリアスを作成することもできます。

40
jathanism

Javaの規則にも独自の欠点があります。すべてのオープンソースパッケージの背後に安定したWebサイトがあるわけではありません。ウェブサイトが変更された場合、メンテナは何をすべきですか?また、このスキームを使用すると、パッケージ名が長くなり、覚えにくくなります。最後に、パッケージの名前は、所有者ではなく、パッケージの目的を表す必要があります

17
user283145

PythonパッケージにはJavaに似た命名規則はありません。もちろん、自分で開発したパッケージにはそれを採用できますが、サードパーティから採用したパッケージを侵襲的に編集する必要があるかもしれませんが、そして「文化的に異質な」命名規則はおそらくあなたの組織の外で広く採用されるべきあなた自身のパッケージの変更を樹立するでしょう。

技術的には、Python(いくつかのfromステートメントを少し長くするだけで、大したことではありません)のJavaの規則に問題はありませんが、実際には文化的側面はそれはほとんど実行不可能です。

7
Alex Martelli

これを探しに来る人のための更新:

2012年現在、 PEP 42 がこれに対処しています。 PEP 8 トピックについて簡単に触れますが、すべて小文字またはアンダースコアのみです。

その要点:PyPIでまだ使用されていない、覚えやすい意味のある名前を選択してください。

5
Tom

通常、パッケージ階層がない理由は、Pythonパッケージはそのように簡単に拡張されないためです。パッケージは実際のディレクトリです。ただし、パッケージをサブモジュールの複数のディレクトリで探すことができます(パッケージの__path__リストへのディレクトリ)これは便利ではなく、簡単に間違ってしまいます。why Pythonの場合、パッケージはそのように簡単に拡張されません)ええ、それは設計上の選択です。Guidoは深い階層が好きではなく(それでも嫌いです)、それらが必要だとは思いませんでした。

慣例では、プロジェクトには明白ですがプロジェクトに固有のトップレベルパッケージ名を選択します。たとえば、プロジェクト自体の名前です。必要に応じて、内部をすべて構造化できます(制御できるため)。パッケージを個別の所有者で個別のビットに分割するのは少し手間がかかりますが、いくつかのガイドラインがあれば可能です。ほとんど必要ありません。

5
Thomas Wouters

必要に応じて、この規則の使用を妨げるものは何もありませんが、Pythonの世界ではまったく標準的ではないため、おそらくおかしな外観になります。管理者の面倒を見るのはそれほど楽しくありません。 comに深くネストされているパッケージ。

Javaから来た人にはだらしないように聞こえるかもしれませんが、実際にはweb.pyのように名前が貧弱なパッケージであっても、大きな問題を引き起こしたようには見えません。

名前空間の競合を頻繁にdoする場所は、相対的なインポートです:_package.module1_のコードが_import module2_を試行し、標準ライブラリの_package.module2_と_module2_の両方(stdlibは大きくて成長しているため、一般的に存在します)。幸いなことに、あいまいな相対インポート 廃止予定

3
bobince

私は何年もpythonを使用しており、衝突の99.9%は、新しい開発者がファイル「xml.py」に名前を付けようと試みているのを見てきました。 Javaスキームにはいくつかの利点がありますが、ほとんどの開発者は合理的なパッケージ名を選択できるほど賢いので、それほど大きな問題ではありません。

1
mikerobi