57

mypackモジュールmod_aを含むパッケージがありmod_b、その中にあります。mod_a私はパッケージ自体を自由にインポートするつもりです:

import mypack
import mypack.mod_a

mod_bしかし、私は専用に保管したいと思いmypackます。これは、後者の内部コードを整理するためだけに存在するためです。

私の最初の質問は、このような「プライベート」モジュールを持つことは、Python プログラミングで受け入れられている慣行ですか?

はいの場合、私の 2 番目の質問は、この意図をクライアントに伝える最善の方法は何ですか? 名前の前にアンダースコア (つまり ) を付ける必要があります_mod_bか? または、サブパッケージを宣言して、privateそのようなモジュールをすべてそこに配置することをお勧めしますか?

4

5 に答える 5

53

プライベート モジュールの前にアンダースコアを付けて、ユーザーに意図を伝えます。あなたの場合、これはmypack._mod_b

これは、Python モジュールでラップされている場合に C 拡張モジュールの名前を先頭にアンダースコアを付けて命名するという PEP8 の勧告と同じ精神です (ただし、完全に類似しているわけではありません)。すなわち、_socketおよびsocket

于 2012-02-14T23:17:27.137 に答える
16

私が決めた解決策は、サブパッケージ「プライベート」を作成し、そこに隠したいすべてのモジュールを配置することです。このようにして、それらは収納されたままになり、mypackのモジュールリストがよりクリーンで解析しやすくなります。

私には、これも非Pythonのようには見えません。

于 2010-09-05T06:30:42.403 に答える
11

明示的なプライベート キーワードはありませんが、プライベート関数を 1 つのアンダースコアで開始するという規則がありますが、先頭に 2 つのアンダースコアを付けると、他の人がモジュールの外部から関数を簡単に呼び出すことができなくなります。PEP 8から以下を参照してください

- _single_leading_underscore: weak "internal use" indicator.  E.g. "from M
  import *" does not import objects whose name starts with an underscore.

- single_trailing_underscore_: used by convention to avoid conflicts with
  Python keyword, e.g.

  Tkinter.Toplevel(master, class_='ClassName')

- __double_leading_underscore: when naming a class attribute, invokes name
  mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

- __double_leading_and_trailing_underscore__: "magic" objects or
  attributes that live in user-controlled namespaces.  E.g. __init__,
  __import__ or __file__.  Never invent such names; only use them
  as documented.

__init__.pyモジュール全体を非公開にするには、そのファイル をインクルードしないでください。

于 2010-08-30T21:26:11.660 に答える
2

Python は、「プライベート」または「保護された」メソッドまたはクラスを厳密に認識またはサポートしていません。単一のアンダースコアで始まるメソッドは公式の API の一部ではないという慣例がありますが、クラスやファイルではこれを行いません。醜いです。

誰かが本当に mod_b をサブクラス化またはアクセスする必要がある場合、なぜそれを妨げるのでしょうか? 直接アクセスして代わりに mypack を使用してはならないモジュール内のドキュメントとドキュメントで優先 API をいつでも指定できます。

于 2010-08-30T17:16:21.790 に答える