如何在导入python模块时排除对象

mjqavswn  于 2022-12-30  发布在  Python
关注(0)|答案(3)|浏览(135)

假设这个包只包含一个模块:

mypackage/
    __init__.py
    mymodule.py

__init__.py文件为空,mymodule.py模块如下:

from math import pi

def two_pi():
    return 2 * pi

以下是mymodule的内容:

>>> from mypackage import mymodule
>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'pi', 'two_pi']

当我导入模块时,对象pi出现了,但我不希望它出现在那里。
如何避免pi出现在mymodule中?
我尝试过定义__all__ = ['tow_pi'],但是这只在使用from mypackage.mymodule import *导入时有效。

2ul0zpep

2ul0zpep1#

无法对mymodule隐藏pi,因为它只是模块全局名称空间的一部分,是模块对象的一个属性。
解决方法是在本地导入pi,而不是在mymodule.py中导入:

def two_pi():
    from math import pi
    return 2 * pi
eaf3rand

eaf3rand2#

我不明白你为什么要这么做,因为从mymodule中删除pi会导致two_pi()不工作。无论如何,你可以使用del(mymodule.pi)mymodule中删除对象pi
您可能希望将pi作为参数传递给函数,当然也可以传递from mymodule import two_pi

q9yhzks0

q9yhzks03#

您可以使用以下两个文件:两个pi.py和两个pi执行py

__两个pi执行py

from math import pi as __pi

def two_pi():
    return 2 * __pi

两个π.py

import __two_pi_impl

two_pi = __two_pi_impl.two_pi

然后:

>>> import two_pi
>>> dir(two_pi)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__two_pi_impl', 'two_pi']

相关问题