4
def __hello_world(*args, **kwargs):
  .....

そして私は試しました

from myfile import __helloworld

非公開のものをインポートできます。

プライベート メソッドをインポートするにはどうすればよいですか?

ありがとう。


現在、単一のアンダースコアを使用しています。

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    from myfile.ext import _hello_world
ImportError: cannot import name _hello_world

私のtest.pyで

sys.path.insert(0, os.path.abspath(
                    os.path.join(
                        os.path.dirname(__file__), os.path.pardir)))

from myfile.ext import _hello_world
4

4 に答える 4

8
$ cat foo.py
def __bar():
    pass

$ cat bar.py
from foo import __bar

print repr(__bar)

$ python bar.py
<function __bar at 0x14cf6e0>

おそらくあなたはタイプミスをしましたか?

ただし、通常、ダブルアンダースコアメソッドは実際には必要ありません。通常、「パブリック」APIはゼロアンダースコアであり、「プライベート」APIはシングルアンダースコアです。

于 2012-04-30T03:43:22.777 に答える
2

最新のソースがインポートされていますか? 最新のソースをインポートしていることを再確認してください。

これを実行して確認してください:

>> import myfile.ext
>> print dir(myfile.ext)

すべてのメソッドが表示されるはずです (ダブル アンダースコアはスキップされると思いますが、シングルは表示されます)。そうでない場合は、古いバージョンを使用していることを意味します。

これで問題ないのに、まだ実際のものをインポートできない場合。virtualenv を作成し、再試行してください。

于 2012-04-30T04:06:01.710 に答える
0

を使用して宣言されたモジュール レベルの関数をインポートすることを妨げるものは何もありません__。Python は、クラスの「プライベート」メソッドに名前マングリングを実装して、派生クラスでの事故を回避しますが、モジュール レベルの定義に影響を与えるべきではありません。私のテストでは、これに問題はありません:

ファイル A


def __test(): pass

ファイル B


from A import __test

print __test  # output is <function __test at 0x024221F0>

私が「プライベート」と言ったのは、そうすることに興味がある人がそれらのメソッドをインポートできるからです。

于 2012-04-30T03:49:20.790 に答える