为便于管理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.

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

推荐PyPI第三方库


热门话题
安卓在java中加入字符串组以创建复合字符串   java系统甚至不点击“下一步”或“上一步”按钮就将我返回到上一页,而不是进入下一页   java如何在arrayList中获取特定列的不同值   CXF GZIP REST JAVA   Java:使用大量半恒定标志检查优化循环中的循环?   java如何在两个应用程序之间进行会话管理?   java SVG文件使用蜡染(但没有轴线)转换为PNG   使用协议缓冲区和内部数据模型的java   java如何在logtag 安卓中打印和查看字符串的值   javascript如何在NodeJs中应用Java/Spring的分层架构?   java Spring URL在JSP中编码不正确   模式对话框后面的java工具提示   java WSRPC生成日历对象而不是日期   在对象外部无法识别类变量   java将图像从文件读/写到BuffereImage的最快方法?   JavaSpring数据存储库对具有不同Id的子类使用抽象超类   安全在Java 5.0上运行web应用程序服务器有危险吗?