2012-04-30 4 views
4
def __hello_world(*args, **kwargs): 
    ..... 

と私は非プライベート1をインポートすることができますPythonでプライベートメソッドをインポートするにはどうしたらいいですか?

from myfile import __helloworld 

を試してみました。

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

ありがとうございました。


私は現在1つのアンダースコアを使用しています。

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 
+0

Typo?あなたが受け取ったエラーを貼り付けることはできますか? –

+0

エラーを_exactly_に貼り付けた場合は、インポート時に2つのアンダースコアを使用しなかったようです。 –

+0

はい。正確に私が持っているもの。私はコンソールでこれを行いました(コンソール内でインポートする)と同じことを言った。 – User007

答えて

7
$ 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は単一のアンダースコアです。

+0

私はそれらをテストしたいと思いますが、開発者がパブリックAPIではないことを彼らに知らせるために、それらを「プライベート」にします。単一のアンダースコアを試してみましょう。 – User007

+2

一般的に、これは単一アンダースコアメソッドが使用される方法です。 – Amber

+0

ありがとうございます。私は自分の投稿を編集しました。その間に何かを試してみましょう。ありがとう。 – User007

0

__を使用して宣言されたモジュールレベルの関数をインポートできないようにするには、何もありません。 Pythonは、派生したクラスの事故を避けるために、クラスの "private"メソッドに名前のマングリングを実装しますが、モジュールレベルの定義には影響しません。 I私のテスト私はこれで何の問題もない:

ファイルを


from A import __test 

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

は、私が "プライベート" と言う


def __test(): pass 

ファイルBなぜならそうすることに興味を持って誰かそれらのメソッドは引き続きインポートできます。

+0

ありがとうございます。 Iv'eは私のポストを更新しました。私は上記の同じコードを使用して他のメソッドをインポートすることができます。 – User007

2

最新のソースをインポートしてもよろしいですか?最新のソースをインポートしていることを再度確認します。

は、これを行うことによってそれを確認してください。

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

あなたはすべてのメソッド(私は2つの下線がスキップされますと思うが、シングルはまだ表示されます)を参照してくださいする必要があります。そうでない場合は、古いバージョンがあることを意味します。

これが表示されても、実際のものをインポートすることはできません。 virtualenvを作り直してみてください。

関連する問題