包含插件类的包的Python项目结构

时间:2017-08-24 21:34:45

标签: python python-3.x directory-structure python-packaging

我刚刚开始一个新的开源Python(3)项目。但是,到目前为止,我的Python脚本始终仅限于一个文件。我试图制作一个可安装的软件包(可以通过PyPi安装)然后可以在使用pip3安装软件包之后将其自己的脚本导入其中。

这是我当前的项目树。

├── LICENSE
├── README.md
└── library
    ├── CHANGELOG.txt
    ├── LICENSE.txt
    ├── MANIFEST.in
    ├── README.txt
    ├── setup.py
    └── my-module
        ├── __init__.py
        ├── plugins
        │   ├── __init__.py
        │   └── some-plugin.py
        └── my-module.py

有关结构的信息和推理。

  • 第一级只适用于GitHub仓库。
  • 第二级(库文件夹)是包本身,将上传到PyPi。
  • 第三级(my-module)是包含主脚本my-module.py的实际模块目录,最后将在用户的脚本中导入。
  • 第四级(插件)将包含脚本的所有插件类。我们的想法是用插件隔离大部分逻辑。

我如何考虑内部运作的一个例子。

示例插件some-plugin.py

#!/usr/bin/env python
import tweepy


class MyFirstPlugin:
  def __init__(self):
      self._consumer_key = None
      ...

  # Getters.
  @property
  def consumer_key(self):
      return self._consumer_key
  ...    

  # Setters.
  @consumer_key.setter
  def consumer_key(self, value):
      self._consumer_key = value
  ...

  # Deleters.
  @consumer_key.deleter
  def consumer_key(self):
      del self._consumer_key
  ...

  def do_magic(self):
      return "Some magic logic"

my-module.py代码示例:

#!/usr/bin/env python
import plugins.some-plugin as somePlugin

t = None
def setupTwitter(consumer_key, ...):
    t = somePlugin.MyFirstPlugin()
    t.consumer_key = consumer_key
    ...

def getTwitterFollowers():
    return t.do_magic()

my-awesome-script.py的使用示例:

#!/usr/bin/env python
import my-module # after installing it with pip3

my-module.setupTwitter('my super secret consumer key', ...)
followers = my-module.getTwitterFollowers()

几个问题:

  1. 使用类将主要模块中的部分代码隔离在Python中的一般想法是一个好主意/实践吗?在我的例子中,我采用的方法是一种好方法吗?
  2. 文件夹结构是否与包的编写方式一致?我很难找到一个很好的例子和文档。
  3. 带有getter / setter / deleters的类是常用的策略吗?
  4. 现在我可以看到很多关于我的问题的个人意见,但我更关注推荐的解决方案/最佳实践。其他建议也随时欢迎。在我真正开始研究之前,我想确保我拥有基本结构。

0 个答案:

没有答案