布尔表达式求值器

beval的Python项目详细描述


########################################
Boolean expression evaluator
########################################
The utility is designed to capture bool expressions as criteria objects and perform evaluations against one to many in-memory objects. 例如,给定一个实例或car或dict类型的对象列表,或者基本上任何包含以下信息的类型。有关汽车对象的列表,请参见tests.test_helper。

+——+——+——+——+——+——+——+——+——+——+——+——+——————+—————————————————————————————————————————————————————————————————————————————|
+==============================+=======+=======+=====+=======+===========+====+====+====+====+======+========+=======================================================================================+——————————————————————————————————————————————————————————————————————————福特|紧凑型12.2 22 27无前部|
+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————只要评估对象具有属性或方法,它就可以是任何类型。

>;>;subaru={"make":"subaru","type":"compact","mpgcity":30}<;--定义dict
>;>;acura={"make":"acura","type":"small","mpgcity":25}
>;>;从beval.criteria导入eq,介于
>>eq=eq("make","subaru")
>>eq(subaru)
(true,none)
>>eq(acura)
(false,none)

>;gt;>;BTW(斯巴鲁)
(真,无)
>;>;BTW(讴歌)
(假,无)


===============
========br/>有关定义条件的更多信息
=======br/>定义"make"为"讴歌"的汽车的搜索条件,"type"是"small","drivetrain"是"front",有3个选项,

("make='acura'and type='small'and drivetrain='front')


option 2,用波兰语表示法创建一个条件,排序为


>;>;search_criteria=criteria().eq("make","acura").eq("type","small").eq("drivetrain","front").all().done()

option 3,或者简单地组合一个criteria对象

>;>;搜索条件=全部(eq("make","acura"),eq("type","small"),eq("drivetrain","front"))



调用带有基础对象或CTX对象的"调用"方法,该对象环绕基础对象

>;;(ans,err)=搜索条件(acura_small)
(true,none)
>;;(ans,err)=搜索条件(ctx(acura_small,false))
(true,无)

option 2,调用eval方法,使用ctx对象

>;>;(ans,err)=搜索条件。eval(ctx(acura_small,fuzzy=false))
(true,none)


option 3,定义一个简单函数,以更改返回类型和行为

>;def评估(标准,obj,fuzzy=false):
(ans,err)=标准(obj,fuzzy)
如果ans in(const.unknown,const.err或者,):
提高错误
否则:
返回ans
>;>;评估(搜索条件,acura_small)
true



expr="make='acura'和type='small'和drivetrain='front'"
>;expr
"make='acura'和type='small'和drivetrain='front'
>;>;搜索条件=到条件(expr)
>;>;str(搜索条件)
"make='acura'and type='small'and drivetrain='front'


=================


====================
更改条件的计算行为质量,模糊搜索选项可以打开。当标志处于启用状态时,尽管在访问不存在的属性或比较期间引发异常时出错,计算器仍将继续计算下一个条件。例如,给定一个具有不存在的属性"cpu"的表达式:

>;>;搜索条件=到条件("cpu='intel'and make='acura'and type='small'and drivetrain='front'")
>;>;类型(搜索条件)
beval.criteria.all
>;>;str(search_criteria.many[0])<;--检查
"cpu='intel'"
>;>;str(search_criteria.many[1])中的第一个条件<;--检查
"make='acura'"
>;>;搜索条件(acura小,fuzzy=false)
("uu error",keyrerror('找不到项cpu')
>;>>搜索条件(acura_small,fuzzy=true)
(true,keyrerror('找不到项cpu')

在"all"条件求值期间,求值器从第一个"eq"条件开始,其中cpu='intel'。对于car对象acura_small,它没有"cpu"属性,因此会引发并捕获一个keyrerror。"然后,所有"条件求值器"继续检查下一个"eq"条件,其中type='small'等。产生的err对象(如果有的话)是遇到的第一个错误/异常。



=================================
==============br/>一个简单的方法,可以理解列表,

>;>;cars=[{"make":"subaru","传动系":"全部"},{"制造":"Acura","传动系":"前部"},{"制造":"Ford","传动系":"前部"}
>;>>搜索"标准=到"标准("制造==‘Acura’和传动系=‘前部’")
>;>;matched=[car for car in cars if true in search_criteria(car)]>;gt;def predicate(obj):
(ans,err)=搜索条件(obj)
如果ans in(const.unknown,const.error,):
提高err
否则:
返回ans
>;matched=filter(predicate,cars)
>;len(matched)
1
>;>matched[0]
{drivetrain':'front','make':'acura'}


>或创建一个通用谓词函数并使用functools.partial绑定参数,

>;>from functools import partial
>;>def谓词(条件,fuzzy,obj):
(ans,err)=条件(obj,fuzzy)
如果ans in(const.unknown,const.error,):
raise err
否则:
返回ans
>;predicate2=部分(predicate,search_criteria,false)
>;>;matched=filter(predicte2,cars)
>;>len(matched)
1
>;>>匹配的[0]
{"传动系":"前部",'make': 'Acura'}


===========================
A bit of info on Ctx
===========================
TBA


===========================
List of available criteria classes
===========================
* Bool
* Eq
* NotEq
* Between
* Gt
* gte
*lt
*lte
*in
*notin
*和
*all
*或
*any
*not

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

推荐PyPI第三方库


热门话题
maven通过pom文件增加最大java堆大小   java如何在Kojo IDE输出窗格中打印到同一行?   如何使用特定的JRE交付Java应用程序?   java Cordova插件调用日志找不到符号   Java上Redis哈希中的spring列表   java ThreadSafeClientConnManager不是多线程   java如何在激活器中获取IEclipseContext   java如何通过编程更改除法器偏差   在中找不到maven Java/Mvn本地资源。罐包装   JOptionPane的java用户输入验证。showInputDialog   java编辑:如何更改日期对象的日期格式?   文件编写器Java;如何覆盖   一行中包含多个值的java读取属性   java如何在安卓中使用截击上传视频