2

次のファイルがあります。

./main.py
./lib/__init__.py
./lib/lib.py

$ cat lib/lib.py

def method():
    return 'method'

$ cat lib/__init__.py

from .lib import *

$ cat main.py

import lib

def main():
    print(lib.lib)

if __name__=='__main__':
    main()

が定義されている理由がわかりませんlib.lib。lib.py ファイルの変数ではありません。何か案は?

4

1 に答える 1

3

lib.libオブジェクトは、パッケージ内のネストされたlip.pyファイルです。lib

サブモジュールをインポートすると、パッケージの属性としても使用できるようになります (ファイルに名前含まれていない場合)。lib__init__.py

Python 3.3 モジュール ローダー (Python で実装) は、ネストされたモジュールを parent の属性として設定するだけです。

# [find a loader and load the module object, setting sys.modules[name]]
module = sys.modules[name]
if parent:
    # Set the module as an attribute on its parent.
    parent_module = sys.modules[parent]
    setattr(parent_module, name.rpartition('.')[2], module)

この動作は、 Python パッケージのドキュメントで多かれ少なかれ暗示されています。

すべてのモジュールには名前があります。サブパッケージ名は、Python の標準属性アクセス構文と同様に、親パッケージ名からドットで区切られます。したがって、 というモジュールとsysというパッケージがemailあり、その中に というサブパッケージとemail.mime、そのサブパッケージ内の というモジュールがありますemail.mime.text

于 2013-07-03T12:30:03.487 に答える