构建一个简单导入的包

问题描述 投票:0回答:1

例如,Python标准库中的函数被设计成可以简单地导入和使用。

import re
m = re.search('foo')

包的文档中 https:/docs.python.org3tutorialmodules.html#packages 有一个子包布局的例子。 但是让我们把它简化为只有一个包,没有子包。

sound/                  Top-level package
    __init__.py               Initialize the sound package
    wavread.py
    wavwrite.py
    ...

我们假设wavread.py定义了一个函数。

def read_wav(name):
    return 'Hello ' + name

在这个包中的函数被调用的时候需要用到:

  1. 包名(声音)
  2. 文件名
  3. 文件中定义的函数名(read_wav())

比如说:

import sound.wavread

sf = sound.wavread.read_wav('foo')

或者:

import sound.wavread as sound

sf = sound.read_wav('foo')

问题。 应该如何创建一个包,使其既能导入又能简单使用,而不需要向包用户暴露python文件名(如, wavread)的文件名? 可以创建一个 "包",就是一个文件,包含所有的功能,但是一个巨大的文件并不是很模块化。 什么是Pythonic的方式来结构一个复杂的包,既方便使用又方便维护?

希望用户的代码。

import sound

sf = sound.read_wav('foo')
python python-packaging
1个回答
4
投票

__init__.py 做以下工作。

from .wavread import * #or only the functions you want to export from  wavread.py
from .wavwrite import *
# and so on for all files that implement function of the sound module

这样声音模块的用户就可以做到:from sound import * 或者 from sound import read_wav

import sound
# ...
sf = sound.read_wav('foo')
© www.soinside.com 2019 - 2024. All rights reserved.