2

__init __。pyを使用して、パッケージ内のすべてのモジュールを__main__のエイリアスとしてインポートし、インタラクティブモードから簡単に呼び出すことができるようにします。たとえば、サンプルファイルツリーは次のとおりです。

foobar/
    __init__.py
    foo.py
    bar.py

Pythonインタープリターから、パッケージをインポートして、次のような定義済みのエイリアスを使用してすべてのモジュールにアクセスできるようにします。

>>> import foobar
>>> <module 'foobar' from 'C:\...'>
>>> f.func()
>>> b.func()

これには、__init__。pyに次の行に沿って何かを含める必要があります。

# __init__.py

from . import foo as f
from . import bar as b

# these will not work
__main__.f = f
__main__.b = b

どうすればこれを機能させることができますか?

編集

from foobar import *エイリアシングを使用できないため、使用したくありません。

from foobar import foo as fモジュールが何百もある可能性があるため、インタラクティブモードを開始するたびに、すべてのモジュールを入力するのは効率的ではありません。

4

3 に答える 3

3

__init __。pyファイルには、次のようなものを含めます。

import foo
import bar as b

次に、インタラクティブセッションで次を使用します。

>>> from foobar import *
>>> value = foo.some_func()
>>> instance = b.SomeClass()

また、ほとんどのPythonプログラマーはこれを悪いスタイルと見なしていることにも言及する必要がありfrom foobar import *ます。インタラクティブセッションでは問題ありませんが、モジュールまたはスクリプトで同じことを実行したい場合は、次の方法をお勧めします。

from foobar import b, foo
于 2012-10-26T16:18:28.790 に答える
1

モジュールが明示的に指示されていない状態で別のモジュールの名前空間に物事を追加することは、非常に悪い動作です。彼らが言うように、明示的は暗黙的よりも優れています。

複雑なことは避け__init__.py、メインモジュール(またはコマンドライン)でこれを行うことをお勧めします。

import foobar.foo as f, foobar.bar as b

編集:

本当に必要な場合は、メインモジュールをいじることができます。おそらく良い考えではありませんが、次の方法があります。

import sys

import foo, bar

main = sys.modules["__main__"]
main.f = foo
main.b = bar

さて、何人かの人々が言っ​​ているように、モジュールのインポートにそのような副作用を持たせることは通常良い考えではありません。少なくとも、あなたのコードを読んだことがある人は誰でも非常に混乱するでしょう。「待って、このf変数はどこから来たの?」

モジュールにグローバル名前空間に挿入させる代わりに、モジュールに独自の名前空間で必要なエイリアシングを実行させ、それを使用from module import *して名前空間のエイリアスを取得することをお勧めします。

foobarのファイルを次の__init__.pyようにします。

from . import foo as f
from . import bar as b

次に、メインモジュールで次の操作を行います。

from foobar import *
# now you can use f and b

何百ものインポートを行う必要がある場合は、それらすべてをに入れてください__init__.py。または、それらがそのパッケージに関連付けられていない場合は、別のモジュールを使用してエイリアシングを処理します。

于 2012-10-26T17:58:35.417 に答える
0

Pythonモジュールがそのような名前空間から抜け出すように指定されていないだけであり、Pythonは一般的に良い考えではないすべてを効果的に制限する傾向があるため、それは不可能です。インタラクティブコンソールには、スタートアップフックのようなものがあるかもしれません。

あなたの生活を楽にするかもしれないもう一つのアイデア:モジュールに書いてください:

foo = "foo!"
bar = "bar!"

def add_to(obj):
    obj['f'] = foo
    obj['b'] = bar

インタラクティブコンソールの場合:

>>> from stuff import add_to
>>> add_to(globals())
于 2012-10-26T19:25:39.373 に答える