属性:类属性验证和自动补全的组织辅助工具和包装器
项目描述
概述视频
2016年11月的属性概述。
为什么
属性提供了一个结构,以帮助在交互式编程环境中进行开发,同时允许轻松过渡到生产代码。它强调在代码生命周期的每个阶段为开发人员和用户提供可用性和可重复性。
范围
properties
包允许以一致和声明的方式创建 强类型 对象。这允许 验证 开发人员期望并连接到 通知 和其他库。它提供文档,无需额外工作,并提供 序列化 以实现可移植性和可重复性。
目标
保持干净的命名空间以方便交互式编程
优先考虑文档
提供内置的序列化/反序列化
连接到其他库以实现GUI和可视化
文档
API 文档可在 ReadTheDocs 上找到。
替代方案
attrs - “无需样板代码的Python类” - 这是一个流行的、积极开发的库,旨在简化类创建,尤其是在对象协议(即双下划线方法)方面,使用简洁的声明性代码。
与属性相似之处包括类型检查、默认值、验证和强制转换。也有一些不同之处
attrs 有点像 namedtuple,而 properties 则更像 dict 或可变对象。
因此,attrs 能够处理哈希、比较方法、字符串表示等。
与 properties 相比,attrs 的运行时性能开销更小
另一方面,properties 侧重于交互性,包括通知、序列化/反序列化以及可变、可能无效的状态。
properties 有许多内置类型,并已设置现有的复杂验证。这包括容器和实例属性的递归验证。attrs 只允许指定属性类型。
properties 在自动生成的类文档方面更加详细和规定性,无论好坏。
traitlets(Jupyter 项目)和 traits(Enthought) - 这些库由 GUI 开发驱动(Jupyter 环境的大部分建立在 traitlets 之上;traits 具有自动生成 GUI 的功能),这导致了与 properties 相似的功能,如强类型、验证和通知。此外,Properties 的某些功能和 API 的某些方面受到了 traitlets 的重大启发。
然而,properties 在一些关键领域有所不同
properties 有一个干净的命名空间 - 这(加上 ? 文档字符串)允许在交互式编程环境中非常容易地发现。
properties 优先考虑文档 - 这在 traits 或 traitlets 中尚未明确实现,但在 properties 中是开箱即用的。
properties 优先考虑序列化 - traits 中的序列化(但难以自定义)和 traitlets 中的配置文件(需要超出标准类定义的额外工作)都存在;在 properties 中,序列化开箱即用,但也可以高度自定义。
properties 允许无效对象状态 - traits/traitlets 的 GUI 重点是任何时间点的无效对象状态都不行;没有这个限制,properties 允许交互式对象构建和实验。然后当用户准备就绪时进行验证,调用
validate
特质和特性相对于属性的显著优点包括GUI交互和更广泛的现有属性类型集。除了这些库内置的多种类型之外,还有一些其他示例,例如支持单位转换的特质类型和NumPy/SciPy 特质类型(注意:属性具有 NumPy 数组属性类型)。
param - 此库还提供类型检查、验证和通知。它有一些独特功能和参数类型(可能值得关注的是,可以在任何时间提供参数的动态值,而不仅仅是作为默认值)。这最初是在内置 Python 属性之前引入的,并且当前的开发速度非常缓慢。
内置 Python 数据类装饰器 - 提供“具有默认值的可变命名元组” - 这通过向类添加几个对象协议双下划线方法来实现类似的功能。数据类干净、轻量,包含在 Python 3.7 中。然而,它们不提供与上述库一样多的内置功能或定制。
内置 Python 属性 - 使用
@property
可以在很大程度上重新创建属性/特质类似的行为。这需要程序员进行大量工作,并且结果代码难以阅读。mypy、PEP 484 和 PEP 526 - 这为 Python 提供了静态类型,没有强制转换、通知等。它与特质类似库具有非常不同的范围和实现。
连接
casingSimulations - 存在井套管时的电磁模拟研究存储库
OMF - 开放采矿格式 API 和文件序列化
SimPEG - 地球物理学的模拟和参数估计
Steno3D - 用于构建和上传 3D 模型的 Python 客户端
安装
要安装存储库,请确保您已安装 pip 并运行
pip install properties
对于开发版本
git clone https://github.com/seequent/properties.git
cd properties
pip install -e .
示例
让我们从一个用于组织咖啡习惯的类开始。
import properties
class CoffeeProfile(properties.HasProperties):
name = properties.String('What should I call you?')
count = properties.Integer(
'How many coffees have you had today?',
default=0
)
had_enough_coffee = properties.Bool(
'Have you had enough coffee today?',
default=False
)
caffeine_choice = properties.StringChoice(
'How do you take your caffeine?' ,
choices=['coffee', 'tea', 'latte', 'cappuccino', 'something fancy'],
required=False
)
CoffeeProfile
类有 4 个属性,它们都有文档说明!这些可以在类实例化时设置
profile = CoffeeProfile(name='Bob')
print(profile.name)
Out [1]: Bob
由于为 had_enough_coffee
提供了默认值,所以响应是(自然地)
print(profile.had_enough_coffee)
Out [2]: False
我们可以将 Bob 的 caffeine_choice
设置为可用的选项之一;他喜欢咖啡
profile.caffeine_choice = 'coffee'
此外,Bob 今天已经喝到了第四杯咖啡的一半
profile.count = 3.5
Out [3]: ValueError: The 'count' property of a CoffeeProfile instance must
be an integer.
好吧,Bob,大口喝咖啡吧
profile.count = 4
现在 Bob 的 CoffeeProfile
已建立,properties
可以检查其是否有效
profile.validate()
Out [4]: True
属性类使用 Sphinx-style reStructuredText 自动生成文档!当您请求 CoffeeProfile
的文档字符串时,您会得到
**Required Properties:**
* **count** (:class:`Integer <properties.basic.Integer>`): How many coffees have you had today?, an integer, Default: 0
* **had_enough_coffee** (:class:`Bool <properties.basic.Bool>`): Have you had enough coffee today?, a boolean, Default: False
* **name** (:class:`String <properties.basic.String>`): What should I call you?, a unicode string
**Optional Properties:**
* **caffeine_choice** (:class:`StringChoice <properties.basic.StringChoice>`): How do you take your caffeine?, any of "coffee", "tea", "latte", "cappuccino", "something fancy"
项目详情
properties-0.6.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b119ce4c53f4717fa29371c1bb929f422dda7ed90a4559b3583ea77389177263 |
|
MD5 | 17a21f4833a23714abe2f776f93a6e62 |
|
BLAKE2b-256 | c09acd2def3421cd077d80d4973c802d29dcb3fba625190b3678480f228a85bf |