如何在Python中导入私有方法?

时间:2012-04-30 03:36:55

标签: python

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 个答案:

答案 0 :(得分: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是单下划线。

答案 1 :(得分:2)

您确定要导入最新的源吗?仔细检查您是否正在导入最新的来源。

通过这样做来检查:

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

你应该看到所有方法(我认为会跳过双下划线,但仍然会出现单个下划线)。如果没有,则表示您有旧版本。

如果这显示没问题,但你还是无法导入实际的东西。制作一个virtualenv,然后再试一次。

答案 2 :(得分:0)

没有什么可以阻止您导入使用__声明的模块级函数。 Python在类的“私有”方法上实现名称修改以避免派生类中的事故,但它不应该影响模块级别定义。我的测试我对此没有任何问题:

档案A


def __test(): pass

档案B


from A import __test

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

我说“私人”,因为有兴趣这样做的人仍然可以导入这些方法。

答案 3 :(得分:0)

from "module" import *

仅导入“公共”字段和功能。对于私有字段和函数,您需要按照其他答案中所述明确导入它们。请参阅下面的完整示例。在python 3.7.4上测试过

$ cat file_w_privates.py

field1=101
_field2=202
__field3=303
__field4__=404

def my_print():                                                                                
  print("inside my_print")                                                                                                                                                                
def __private_print():
  print("inside __private_print")                                                                                             
def __private_print__():                                                                       
  print("inside __private_print__")

$ cat file_import.py

from file_w_privates import _field2, __field3, __field4__ # import private fields
from file_w_privates import  __private_print, __private_print__ # import private functions
from file_w_privates import *   # import public fields and functions

print(f"field1: {field1}")
print(f"_field2: {_field2}")
print(f"__field3: {__field3}")
print(f"__field4__: {__field4__}")

my_print()
__private_print()
__private_print__()