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
答案 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__()