2

全て。

これは簡単に答えられると思いますが、そうではありません。答えを探している限り、私は単純なことを見落としていると考え続けています。

次のパッケージ構造の python ワークスペースがあります。

    MyTestProject
        /src
           /TestProjectNamespace
              __init__.py
              Module_A.py
              Module_B.py

    SecondTestProject
        /src
           /SecondTestProjectNamespace
              __init__.py
              Module_1.py
              Module_2.py
              ...
              Module_10.py

MyTestProjectNamespace には SecondTestProjectNamespace への参照があることに注意してください。

MyTestProjectNamespace では、SecondTestProjectNamespace のすべてをインポートする必要があります。次のステートメントを使用して、一度に 1 つのモジュールをインポートできます。

    from SecondTestProjectNamespace.Module_A import *
    from SecondTestProjectNamespace.Module_B import *

...しかし、SecondTestProject に 50 個のモジュールがある場合、これは実用的ではありません。

Python は名前空間 / パッケージ内のすべてをインポートする方法をサポートしていますか? どんな助けでも大歓迎です。

前もって感謝します。

4

4 に答える 4

1

他の人が言ったように-それは良い考えではないかもしれません。ただし、名前空間を保持して名前の競合を回避する方法があります。また、モジュール内のすべてのモジュール/サブパッケージを1回のインポートでパッケージユーザーが使用できるようにします。

「pack」という名前のパッケージがあり、その中に「b」変数を定義する「a.py」という名前のモジュールがあるとします。私がしたいのは:

>>> import pack
>>> pack.a.b
1

これを行う1つの方法は、次のようなpack/__init__.pyimport aを挿入することです。したがって、あなたの場合、そのような行を50行必要とし、それらを最新の状態に保ちます。

それほど悪くはない。

ただし、http://docs.python.org/tutorial/modules.html#importing-from-a-package__all__のドキュメントには、ファイルに名前が 付けられた文字列リストがある場合__init__.py、すべてのモジュール/サブパッケージ名がそのリストは、インポートされるときにインポートされますfrom pack import *

それだけでも半分は機能しますが、パッケージのユーザーは、推奨されていない「fromximport*」フォームを実行する必要があります。

__init__.pyただし、変数を定義した後、内部で「... import *」を実行できます。したがって、実行する必要があるのは、最新__all__の状態に保つことだけです。__all__

このTestProjectNamespace/__init__.pyような存在で:

__all__ = ["Module_A", "Module_B", ...]
from TestProjectNamespace import *

TestProjectNamespaceのインポート時に、ユーザーはTestProjectNamespace.Module_A(およびその他)を使用できるようになります。

そしてもちろん、作成を自動化することもできますが__all__、結局のところ、これは単なる変数ですが、お勧めしません。

于 2012-08-31T19:14:52.667 に答える
1

いいえ。 SecondTestProject をセットアップして、サブモジュール内のすべてを自動的にインポートするように設定することはでき__init__.pyますfrom ... import *__import__関数やimpモジュールを使用して、これをある程度自動化することもできます。しかし、このように設定されていないパッケージを取得して、このように機能させる迅速かつ簡単な方法はありません。

とにかく、それはおそらく良い考えではありません。50 個のモジュールがある場合、それらすべてからすべてをグローバル名前空間にインポートすると、名前が急増し、それらの名前の間で競合が発生する可能性が非常に高くなります。

于 2012-08-31T18:56:21.560 に答える
1

はい、pkgutil を使用してロールできます。

以下は、twisted の下にあるすべてのパッケージ (tests を除く) を一覧表示し、それらをインポートする例です。

# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4

import pkgutil
import twisted

for importer, modname, ispkg in pkgutil.walk_packages(
    path=twisted.__path__,
    prefix=twisted.__name__+'.',
    onerror=lambda x: None):
        # skip tests
        if modname.find('test') > -1: 
            continue
        print(modname)
        # gloss over import errors
        try:
            __import__(modname)
        except:
            print 'Failed importing', modname
            pass

# show that we actually imported all these, by showing one subpackage is imported
print twisted.python

スターのインポートは悪い考えだという他のポスターに同意する必要があります。

于 2012-08-31T19:01:12.223 に答える
0

Python は名前空間 / パッケージ内のすべてをインポートする方法をサポートしていますか?

いいえ。パッケージはスーパーモジュールではありません。グループ化されたモジュールの集まりです。


その理由の少なくとも一部は、フォルダー内の「すべて」が何を意味するのかを判断するのは簡単ではないためです。ネットワーク ドライブ、ソフト リンク、ハード リンクなどの問題があります。

于 2012-08-31T18:54:03.600 に答える