为便于管理python映射和列表而构建的一组类
query-collections的Python项目详细描述
一组类,使得在python中管理json对象更加容易(等等?)
为什么?
当想要访问json对象(或python)的索引时 dictionary/map),我们需要使用['member']语法。这很简单 json对象,但是假设有一个复杂的对象 深嵌套元素,例如:
dict_instance['member'][0]['items'][0]['id']
这就是查询集合的来源。现在支持的 结构是映射(python字典)和列表。我们可以这样做 访问每个中的成员:
给定k:v映射:
{ "population": { "faculty": [ { "id": "103902", "name": "Cory", "field": "CS" }, { "id": "6789", "name": "Ted", }, { "id": "67874", "name": "Mike", "field": "CS" } ], "count": 3, "access_codes": [ 1, 2, 3 ] } }
这个具体的例子很难获得信息 需要大量的发电机和其他不必要的膨胀 为了完成一项简单的任务,比如“如果有任何用户是教员, 返回指定了“field”的值
下面是具有常规内置python功能的天真解决方案:
json_obj = ... if json_obj.get('population').get('faculty') is not None: matches = [f_member for f_member in json_obj['population']['faculty'] if 'field' in f_member] return matches return None_
下面是我们如何使用查询dict执行相同的操作:
json_obj = query_dict(...) matches = json_obj.query("population:faculty:*:field!")
在本例中,*表示“列表系的任何成员”,并且 {TT2}$意味着“如果字段存在,返回true”。通配符运算符,by 默认情况下,返回返回值的任何成员。
语法
查询的语法非常容易理解!访问嵌套的 父级成员,只需执行:parent:child。这可以用链子锁起来 任何数量的嵌套。当然这本身是有用的,但是 加上操作符,用例就清楚多了!
可接受的运算符:-*:通配符运算符。返回 给定索引处的元素。^ {TT2}$:存在运算符。返回true 成员存在。
也可以接受规则组合:-默认情况下通配符停止 错误报告并返回其后面的所有匹配元素 查询字符串。例如:.query(“*:id!“)返回的所有成员 ID存在的第一级。我们还可以使用 索引操作符和前缀一个问号。
过滤
从0.0.1.2A8版本起,我们现在可以筛选列表以搜索子项 符合某些筛选条件的。这是一个简单的实现, 但是应该满足这个用例的需求。在字符串中存储值 不是我支持的一个想法(即执行“eq=13”),因此, 过滤器被添加到查询方法的扩展。你可以通过 单个筛选器或多个筛选器(作为数组),可以在 带有“$”运算符的查询字符串,其语法如下:member$filterindex。 如果只有一个筛选器,则不需要执行成员$0,只需执行以下操作:member$ 示例:
对于一个问题,我们需要筛选学生列表以查找GPA>;3.0的学生。 只需如下操作:
results = students.query("*:GPA$", filters.greaterEqual(3.0)) # returns list of students with GPA > 3.0
多个查询(查找GPA>;3.0和出勤率>;90.0的学生列表:
results = students.query("*:GPA$0:*:ATTENDANCE_PCT$1", filters.greaterEqual(3.0), # filter at index '$0' filters.greaterEqual(90.0) # filter at index '$1' ) # returns list of students with GPA > 3.0 and attendance > 90.0
流
从0.0.1a3版本开始,stream类现在处于beta版本。这是 Java 8流API和几乎所有的功能都存在。你可以自己创造 很容易从您自己的类型流,query-dict和query-list包含一个方法 创建流。
results = Stream.of(1,2,3,4,5,6,7,8,9,10) results.filter(lambda x: x > 5)\ .peek(lambda x: print(x)) OUT: 6 7 8 9 10
示例:
您可以在/test目录中找到一个查询示例列表。这个 包括所有当前的运算符组合和基本错误检查。
查询dict和查询列表
目前,这都是通过继承dict的类实现的。 和列表类。这些类的唯一附加功能是 字典成员的点访问和列表的“leng”属性。
查询dict
可以通过点运算符访问字典的成员:
>>> obj = query_dict({_ "name": "Cory", "stats": { "coolness": "over9000" } }) >>> obj.name "Cory" >>> obj.stats.coolness "over9000"
查询长度/长度
>>> mlist = query_list([1,2,3]) >>> mlist.len 3 >>> mlist.length 3
路线图:
- bas的相等运算符IC比较
- 相等比较器
许可证
Query Collections The MIT License (MIT) Copyright (c) 2016 Cory Forward Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.