gpt4 book ai didi

python - 在 pyparsing 中评估 bool

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:24 24 4
gpt4 key购买 nike

我的代码基于 http://pyparsing.wikispaces.com/file/view/simpleBool.py/451074414/simpleBool.py我想解析语言生成的单词,如下所示:

ABC:"a" and BCA:"b" or ABC:"d"

解析后我想评估这个表达式的 bool 值。在代码中,我有带有键 ABC 和 BCA 的字典,ABC:“a”表示 dict[ABC] 中的“a”。

我在某个地方犯了错误,但我找不到哪里,转换为 bool 总是返回 True。

输出:

DEBUG self.value=True

[ABC:"a"[True]] True

DEBUG self.value=False

[ABC:"h"[False]] True

代码:

from pyparsing import infixNotation, opAssoc, Keyword, Word, alphas, dblQuotedString, removeQuotes

d = {
"ABC": "TEST abc TEST",
"BCA": "TEST abc TEST",
}


class BoolOperand:
def __init__(self, t):
self.value = t[2] in d[t[0]]
print(F"DEBUG self.value={self.value}")
self.label = f"{t[0]}:\"{t[2]}\"[{str(self.value)}]"

def __bool__(self):
print("GET V")
return self.value

def __str__(self):
return self.label

__nonzero__ = __bool__
__repr__ = __str__


class BoolBinOp:
def __init__(self, t):
self.args = t[0][0::2]

def __str__(self):
sep = " %s " % self.reprsymbol
return "(" + sep.join(map(str, self.args)) + ")"

def __bool__(self):
print("DEBUG BoolBinOp")
return self.evalop(bool(a) for a in self.args)

__nonzero__ = __bool__
__repr__ = __str__


class BoolAnd(BoolBinOp):
reprsymbol = '&'
evalop = all


class BoolOr(BoolBinOp):
reprsymbol = '|'
evalop = any


class BoolNot:
def __init__(self, t):
self.arg = t[0][1]

def __bool__(self):
print("DEBUG BoolNot")
v = bool(self.arg)
return not v

def __str__(self):
return "~" + str(self.arg)

__repr__ = __str__
__nonzero__ = __bool__


EXPRESSION = Word(alphas) + ":" + dblQuotedString().setParseAction(removeQuotes)
TRUE = Keyword("True")
FALSE = Keyword("False")
boolOperand = TRUE | FALSE | EXPRESSION
boolOperand.setParseAction(BoolOperand)

boolExpr = infixNotation(boolOperand,
[
("not", 1, opAssoc.RIGHT, BoolNot),
("and", 2, opAssoc.LEFT, BoolAnd),
("or", 2, opAssoc.LEFT, BoolOr),
])

if __name__ == "__main__":
res = boolExpr.parseString('ABC:"a"')
print(res, "\t", bool(res))
print("\n\n")
res = boolExpr.parseString('ABC:"h"')
print(res, "\t", bool(res))

最佳答案

如果在程序末尾添加:

print(type(res), bool(res))
print(type(res[0]), bool(res[0]))

你会看到

<class 'pyparsing.ParseResults'> True
GET V
<class '__main__.BoolOperand'> False

res 不是您解析的操作数,它是解析的操作数的 ParseResults 容器。如果您计算 res[0],您将看到操作数的计算方式。

ParseResults 将具有与 bool 列表类似的行为。如果非空,它们将为 True,如果为空,它们将为 False。将这些行添加到您的程序中:

res.pop(0)
print(bool(res))

您会看到 ParseResultsFalse,表明它没有内容。

关于python - 在 pyparsing 中评估 bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48770984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com