如何将函数导入Python包而不导入包含它的文件?

2024-09-23 14:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Mac OSX上的Python 3.4.2中工作,我有一个简单的版本控制的Python项目,其目录/文件结构如下所示:

vcs_projectname/
    foo/
        __init__.py
        simplefunc.py
    docs/
    other_related_stuff/

__init__.py文件如下所示:

^{pr2}$

并且simplefunc.py文件如下所示:

def helloworld():
    print('Hello world!')

通过将cd4{my目录中的一个^{my目录中的^{my)设置为^{mydirectory中的

> cd ~
> export PYTHONPATH=~/vcs_projectname
> ipython

在ipython中,我导入foo包,然后查看其目录结构,结果如下:

In [1]: import foo

In [2]: dir(foo)
Out[2]: 
['__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 'helloworld',
 'simplefunc']

我的问题:如何在包目录结构中去掉对simplefunc文件模块的引用?这是可取的,因为在最好的情况下,它只是无用的杂波(我们不需要它,因为我们真正想要的东西,helloworld()函数,已经由__init__.py文件在包级别可用),在最坏的情况下,它本质上是对不相关的实现细节(底层文件)的引用项目的结构)以后可能会改变,因此我不希望我的用户在未来的版本中期待和依赖它。在


Tags: 文件项目inpy目录fooinitmy
2条回答

你想做的事是不可能优雅的。正如@Lukas所提到的,有一些黑客可以做到这一点。在

相反,我所遵循的是,创建一个名为_private的子包,并将所有这样的模块放入其中。这样当用户导入包时,所有公开的api都是可用的,私有api被隐藏在_private中。在

示例:

foo/
    __init__.py
    _private/
        __init__.py
        test1.py
        test2.py

foo/__init__.py:

^{pr2}$

foo/_private/__init__.py:

from test1 import bar
from test2 import baz

foo/_private/test1.py:

^{4}$

foo/_private/test2.py:

def baz():
    print "baz"

导入foo:

>>> import foo
>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '_private', 'bar', 'baz']

how do I get rid of the reference to the simplefunc file module in the package directory structure?

您可以通过将del simplefunc添加到您的foo/__init__.py中来完成您的既定目标,如下所示:

from  .simplefunc import helloworld
del simplefunc
__all__ = ['helloworld'] # Not sure whether I really need this line...?

相关问题 更多 >