不从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的正常行为,您要求模块提供其中定义的所有名称。