通用的灵活、可扩展的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({})
  • 使datedatetime转换器可自定义,而不是if isinstance语句;
  • 实现更多的验证器和可注册的元数据选项;
  • 基于更复杂的规则(而不是由functools.singledispatch传递的type(field.type))实现更好的“类型分派器”,因为typing模块在python 3.6和3.7之间的发生了一点变化
  • 支持更多类型(typing.Tupledecimal.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。如果圭多不在乎,我(或你)为什么要?

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上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法在更改位置时绘制多边形   java持久化@ManyToOne并带有可选外键?   如何在java中仅获取公共IP地址   java无法使用Shopify代码处理自定义文本框   java Hibernate多功能保存对象   java SpringBoot应用程序忽略HibernateValidator的xml配置   如何复制和重命名Java文件,并在当前执行期间使新文件可用?   java如何解决用户注销的过滤查询   java Spring Boot MVC如何在应用程序中配置多视图目录。属性   java如何在使用绑定调用服务的方法时使用线程   jvm java文件夹中JAR和其他文件的加载顺序   ColdFusion/Java奇怪脚本   java在构造函数中调用可重写方法,即使我们指定它来自超类?   java如何将javafx场景设置为没有图标?