通用的灵活、可扩展的python数据结构
middle的Python项目详细描述
用于一般用途的灵活、可扩展的Python数据结构。数据进出,可靠,无样板,速度快!
middle站在attrs的肩膀上,目标是尽可能简单地将数据从复杂对象获取到python原语,反之亦然,使用验证器、转换器、大量sugar和其他实用程序!middle可以与首选的web框架、后台作业应用程序、配置解析器等一起使用!
偷看
最简单的middle示例及其一些特性(使用python 3.6+语法):
>>> importtyping>>> importmiddle>>> classAddress(middle.Model):... street_name:str... number:typing.Optional[int]... city:str>>> classPerson(middle.Model):... name:str... age:int... address:typing.Dict[str,Address]>>> data={... "name":"John Doe",... "age":42,... "address":{... "home":{... "street_name":"Foo St",... "number":None,... "city":"Python Park"... },... "work":{... "street_name":"Bar Blvd",... "number":"1337",... "city":"Park City"... }... }... }>>> person=Person(data)>>> personPerson(name='John Doe', age=42, address={'home': Address(street_name='Foo St', number=None, city='Python Park'), 'work': Address(street_name='Bar Blvd', number=1337, city='Park City')}) >>> middle.asdict(person){'name': 'John Doe', 'age': 42, 'address': {'home': {'street_name': 'Foo St', 'number': None, 'city': 'Python Park'}, 'work': {'street_name': 'Bar Blvd', 'number': 1337, 'city': 'Park City'}}}
想要一个更复杂的例子,与Python3.5兼容的语法吗?当然!
>>> fromtypingimportDict,List>>> importmiddle>>> classGame(middle.Model):... name:str=middle.field()... score:float=middle.field(minimum=0,maximum=10)... resolution_tested:str=middle.field(pattern="^\d+x\d+$")... genre:List[str]=middle.field(unique_items=True)... rating:Dict[str,float]=middle.field(max_properties=5)>>> data={... "name":"Cities: Skylines",... "score":9.0,... "resolution_tested":"1920x1200",... "genre":["Simulators","City Building"],... "rating":{... "IGN":8.5,... "Gamespot":8.0,... "Steam":4.5... }... }>>> game=Game(**data)>>> gameGame(name='Cities: Skylines', score=9.0, resolution_tested='1920x1200', genre=['Simulators', 'City Building'], rating={'IGN': 8.5, 'Gamespot': 8.0, 'Steam': 4.5}) >>> middle.asdict(game){'name': 'Cities: Skylines', 'score': 9.0, 'resolution_tested': '1920x1200', 'genre': ['Simulators', 'City Building'], 'rating': {'IGN': 8.5, 'Gamespot': 8.0, 'Steam': 4.5}}{ $ }是足够灵活的,可以理解在框中声明的、在模型上的多个类型、多个类型、多个类型。另外,您可以extend it到您自己的类!
警告
重要:middle处于开发的早期阶段。有些需求(比如python-dateutil)在将来的版本中是不需要的;因为有很多功能需要实现,还有一些已知的错误行为需要解决,更不用说在转移到任何其他状态(而不是alpha之前需要进行大量测试。
待办事项
- 用于填充类的别名选项(键);
- 只读和只读字段;
- 更好的错误处理(几乎无处不在);
- 根据其他解决方案创建基准套件;
- 格式化程序仍然丢失;
- 将一个实例“转换”到另一个实例的可能性,其中原始对象是它的子类;
完成
- 如果可能的话,对转换器进行细化,这样str的输入值{}就不会以str({});
- 使date和datetime转换器可自定义,而不是if isinstance语句;
- 实现更多的验证器和可注册的元数据选项;
- 基于更复杂的规则(而不是由functools.singledispatch传递的type(field.type))实现更好的“类型分派器”,因为typing模块在python 3.6和3.7之间的发生了一点变化
- 支持更多类型(typing.Tuple,decimal.Decimal);
- 获得100%(或更接近)的代码覆盖率;
- 大量文档;
- Python3.5支持(除Windows平台外,请参阅下面的Windows开发人员警告);
未来讨论
- 在python 3.7中,添加了一个简洁的特性:dataclasses。我知道不依赖于第三方库(如attrs)听起来真的很棒,但是最新的库提供了很多在python 3.7 dataclasses(目前)上找不到的功能,所以我将继续讨论这个问题。
对Windows开发人员的警告
如果您使用的是windows和python 3.5,我认为middle不适合您。由于this issue,已为python 3.5禁用appveyor中的ci。如果圭多不在乎,我(或你)为什么要?
有用链接
灵感与感谢
一些libs激发了middle:
- cattrs:它在从dict创建attrs实例和再次创建实例方面的速度;
- pydantic:使用typinghints;
- mashmallow:它是我见过的最富功能的建模api之一;
- apistar:简直不可思议!
- Sanic:“得快点!“
- ionelmc/cookiecutter-pylibrary:目前为止我找到的最完整(或最有趣)的cookiecutter模板(也要确保read this article);
许可证
middle是根据MIT许可证发行的自由软件。
变更日志
V0.2.2 2018年10月28日
- 增加了模型具有方法、功能、属性等的可能性。
2018年7月26日v0.2.1
- 与更改日志和manifest.in文件相关的快速修复
2018年7月26日v0.2.0
- 已发布(部分)文档
- 获得99%的覆盖率(最终合并)
- 增加了Python3.5支持
2018年7月2日v0.1.1
- 为Python3.6和3.7添加适当的单元测试和支持
- 使API更具灵活性
- 使用black完成代码格式和检查
2018年6月21日v0.1.0
- pypi上的第一个版本。