Skip to main content

Python 的一个模块,提供使用包、插件和扩展扩展程序的能力。

项目描述

拆除

Dismantle是为 Python 程序创建的一个模块,用于提供使用本地或远程索引中列出并在运行时安装的包提供附加功能的能力。

Dismantle 通过检查包索引并使用该索引来管理包版本来做到这一点。然后包包含插件(使用装饰器)和扩展(使用自定义模块加载器)以向应用程序添加附加功能。

安装拆卸

PyPI 上提供 Dismantle:

$ python -m pip install dismantle

注意:*Dismantle 从 3.7 开始正式支持 Python

支持的功能和最佳实践

Dismantle 在应用程序中提供了灵活性,允许开发人员围绕核心应用程序构建丰富的生态系统。它通过提供以下内容来做到这一点:

索引管理

索引文件用于提供可用包的列表,并提供关于包的信息和可用包的版本。

  • 支持级联的多个索引文件
  • 易于创建自定义索引处理程序,提供定义包索引的其他方法
  • 使用内置 json 的本地索引文件支持
  • 使用内置 json 的基于 url 的索引文件支持
  • 基于 etag 的基于 url 的索引的缓存

打包

索引文件中列出的包提供了捆绑功能的能力,并充当附加功能的传输机制,同时提供安全性。

  • 易于创建自定义包处理程序,提供定义包源的其他方法
  • 易于创建自定义包格式压缩类型和结构
  • 支持 zip、tar.gz、tgz 和本地目录作为内置的包格式
  • 支持内置的本地和基于 url (http/https) 的包处理程序
  • 具有验证包完整性能力的包的哈希验证

扩展

包中包含的扩展提供了一种在运行时根据需要为 Python 模块动态加载模块的方法。通过在 Python 全局模块管理器中替换或添加模块,包可以在运行时替换或扩展应用程序功能。

  • 分类扩展组以过滤扩展类型(例如记录器、解析器等)
  • 支持基于init或 .py 的模块加载。
  • 扩展激活和停用管理。
  • 模块名称冲突避免
  • 分层模块命名

插件

包中包含的插件提供了一种拦截函数参数和返回值的方法,以便动态操作数据。插件可用于数据验证、操作或提供额外的日志记录或审计功能。

  • 基于装饰器的插件,具有前值和后值拦截和/或修改
  • 每个函数有多个插件,能够设置执行顺序
  • 激活管理

示例实现

插入

"""Simple plugin example"""
from dismantle import plugin


class Chat():
    @plugin.register('chat.message')
    def show(self, message):
        print(message)


@plugin.plugin('chat.message', order=-1)
def make_uppercase(message):
    return message.upper()

扩大

"""Full example using all aspects."""
from dismantle.extension import Extensions, IExtension
from dismantle.index import JsonFileIndexHandler
from dismantle.package import LocalPackageHandler


class ColorExtension(IExtension):
    _category = 'color'

    def color(self) -> None:
        ...


class GreenColorExtension(ColorExtension):
    _name = 'green'

    def color(self) -> None:
        print(f'color is {self._name}')


packages = {}
index = JsonFileIndexHandler('index.json')
for pkg_meta in index:
    meta = index[pkg_meta]
    package = LocalPackageHandler(meta['name'], 'foo/path')
    package._meta = {**package._meta, **meta}
    package.install()
    packages[package.name] = package
extensions = Extensions([ColorExtension], packages, 'ext_')
assert extensions.types == ['color']
assert list(extensions.category('color').keys()) == [
    '@scope-one/package-one.extension.green.GreenColorExtension',
    '@scope-one/package-two.extension.red.RedColorExtension',
    '@scope-one/package-three.extension.blue.BlueColorExtension',
]
assert list(extensions.extensions.keys()) == ['color']
assert list(extensions.imports.keys()) == [
    '@scope-one/package-one.extension.green',
    '@scope-one/package-two.extension.red',
    '@scope-one/package-three.extension.blue'
]

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

dismantle-1.0.2.tar.gz (27.0 kB 查看哈希)

已上传 source

内置分布

dismantle-1.0.2-py3-none-any.whl (17.3 kB 查看哈希)

已上传 py3