不从Python模块导出函数
如果我有一个包含以下内容的模块/文件不从Python模块导出函数,python,Python,如果我有一个包含以下内容的模块/文件foo.py: from math import sqrt def foo(): pass 如果我在另一个脚本中导入它,sqrt也在模块foo中定义 import foo dir(foo) 其输出为 [..., # other things 'foo', 'sqrt'] 我如何防止这种情况?i、 例如,指定不导出的sqrt,或者只导出特定的函数-在这种情况下,只导出用户定义的函数。我知道,对于用户定义的函数,您可以通过在模块中使用下
foo.py
:
from math import sqrt
def foo():
pass
如果我在另一个脚本中导入它,sqrt
也在模块foo
中定义
import foo
dir(foo)
其输出为
[..., # other things
'foo',
'sqrt']
我如何防止这种情况?i、 例如,指定不导出的
sqrt
,或者只导出特定的函数-在这种情况下,只导出用户定义的函数。我知道,对于用户定义的函数,您可以通过在模块中使用下划线前缀来私下定义它们,但在这种情况下,它不是用户定义的函数,因此我不能使用下划线前缀来定义它。您不能这样做,但它不应该妨碍,它被绑定到foo
命名空间,如foo.sqrt
。如果从math
导入sqrt
,它将是math.sqrt
。这就是名称空间的全部意义
如果确实要避免导入某些名称,可以执行以下操作:
从foo导入foo,bar,…
在这种情况下,它不是一个用户定义的函数,所以我不能用下划线前缀来定义它
是的,你可以:
from math import sqrt as _sqrt
另一种方法是只导入函数作用域中需要的对象
(虽然这可以回答您的问题,但我仍然不知道您为什么要这样做。这两个选项都很麻烦,不会使您的代码库看起来更好。)您应该使用:
from math import sqrt as sqrt_m
import foo
所以,你可以使用
sqrt_m()
从math
获取sqrt
,以及
sqrt()
从foo
获取sqrt
的?这是python的正常行为,您要求模块提供其中定义的所有名称。