8

如果我有一个foo.py包含以下内容的模块/文件:

from math import sqrt

def foo():
    pass

如果我在另一个脚本中导入它,sqrt也是在模块中定义的foo

import foo    
dir(foo)

其中的输出是

[..., # other things
 'foo',
 'sqrt']

我该如何防止这种情况?即,要么指定sqrt不导出,要么只导出特定函数——在这种情况下,只导出用户定义的函数。我知道对于用户定义的函数,您可以在模块中通过以下划线前缀私下定义它们,但在这种情况下,它不是用户定义的函数,所以我不能用下划线前缀定义它。

4

4 回答 4

6

你不能,但它永远不应该妨碍它,它绑定到foo命名空间,如foo.sqrt. 如果您sqrt从中导入math它将是math.sqrt. 这就是命名空间的全部意义所在。

如果你真的想避免导入某些名称,你可以这样做:

from foo import foo, bar, ...

于 2013-01-12T16:23:46.997 回答
6

在这种情况下,它不是用户定义的函数,所以我不能用下划线前缀定义它。

是的你可以:

from math import sqrt as _sqrt

另一种方法是仅在需要它们的函数范围内导入对象。

(虽然这可能会回答您的问题,但我仍然不知道您为什么要这样做。这两个选项都很麻烦,不会让您的代码库看起来更好。)

于 2013-01-12T16:27:50.603 回答
1

你应该使用:

from math import sqrt as sqrt_m
import foo

所以,你可以使用

sqrt_m()to get the sqrtfrommathsqrt()to get the sqrtfromfoo

于 2013-01-12T16:29:21.637 回答
1

delete如果您不想导入对象,则可以从导入的模块中导入一个对象。如果foo.py看起来像这样:

from math import sqrt
def foo():
    pass

del sqrt

然后在导入时,dir(foo)显示

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
 '__name__', '__package__', '__spec__', 'foo']

然后显然你仍然可以在from math import sqrt任何地方执行 import foo

于 2021-09-20T16:24:38.363 回答