跳转到主要内容

一个库,可以创建任意函数的类似构造函数的变体形式。

项目描述

https://img.shields.io/pypi/v/variants.svg https://img.shields.io/travis/python-variants/variants.svg Documentation Status

variants是一个库,提供创建函数和其他可调用对象的替代形式的语法糖,就像替代构造函数是提供构造函数函数替代形式的类方法一样。

要创建具有变体的函数,只需用@variants.primary装饰主要形式,然后它将.variant装饰器添加到原始函数中,可用于注册新变体。以下是一个简单的函数示例,该函数打印文本,具有指定要打印的文本来源的变体

import variants

@variants.primary
def print_text(txt):
    print(txt)

@print_text.variant('from_file')
def print_text(fobj):
    print_text(fobj.read())

@print_text.variant('from_filepath')
def print_text(fpath):
    with open(fpath, 'r') as f:
        print_text.from_file(f)

@print_text.variant('from_url')
def print_text(url):
    import requests
    r = requests.get(url)
    print_text(r.text)

print_text及其变体可以这样使用

print_text('Hello, world!')                 # Hello, world!

# Create a text file
with open('hello_world.txt', 'w') as f:
    f.write('Hello, world (from file)')

# Print from an open file object
with open('hello_world.txt', 'r') as f:
    print_text.from_file(f)                 # Hello, world (from file)

# Print from the path to a file object
print_text.from_filepath('hello_world.txt') # Hello, world (from file)

# Print from a URL
hw_url = 'https://ganssle.io/files/hello_world.txt'
print_text.from_url(hw_url)                 # Hello, world! (from url)

与singledispatch的不同之处

虽然variantssingledispatch都旨在提供对主要函数的替代实现,但整体目标略有不同。singledispatch根据参数的类型透明地调度到变体函数,而variants提供函数的显式替代形式。请注意,在上面的示例中,print_text.from_filepathprint_text.from_url都接受一个字符串,一个表示文件路径,另一个表示URL。

此外,variantssingledispatch 兼容,因此您可以兼顾两者之优点;以下是一个使用两者的示例

@variants.primary
@singledispatch
def add(x, y):
    return x + y

@add.variant('from_list')
@add.register(list)
def add(x, y):
    return x + [y]

然后根据类型自动在不同的命名变体之间进行分发

>>> add(1, 2)
3
>>> add([1], 2)
[1, 2]

同时也会暴露显式的变体函数

>>> add.from_list([1], 2)
[1, 2]
>>> add.from_list()
      7 @add.register(list)
      8 def add(x, y):
----> 9     return x + [y]

TypeError: unsupported operand type(s) for +: 'int' and 'list'

需要注意的是,variants 装饰器必须是外层装饰器。

安装

要安装 variants,请在您的终端运行以下命令

$ pip install variants

要求

这是一个支持 Python 2.7 和 3.4+ 版本的 Python 库。

版本 0.2.0(2018-05-03)

特性

  • 添加了 variants.inspect 模块,它提供了用于检查变体函数组的公共 API。目前提供两个函数:is_primaryis_primary_method。(GH #29)

  • 在 setup 中添加了 python_requires,以指示支持的 Python 版本。(GH #34)

错误修复

  • 更新了 MANIFEST.in,以包含 NEWS.rst(GH #34)

改进文档

  • 更新了文档中的永久重定向链接。(GH #28)

  • 在文档中扁平化了更改日志的 TOC 条目。(GH #32)

  • 添加了 API 文档部分,包括 inspect 子模块的文档。(GH #33)

项目详情


下载文件

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

源代码分发

variants-0.2.0.tar.gz (19.7 kB 查看哈希

上传时间 源代码

构建分发

variants-0.2.0-py2.py3-none-any.whl (5.6 kB 查看哈希

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面