Python pyparsing——使用函数扩展fourFn.py示例
pyparsing中的fourFn.py示例有一个字典,其中列出了所有支持的函数。我试图添加一个定义来调用统计平均值函数:Python pyparsing——使用函数扩展fourFn.py示例,python,pyparsing,Python,Pyparsing,pyparsing中的fourFn.py示例有一个字典,其中列出了所有支持的函数。我试图添加一个定义来调用统计平均值函数: fn={ “罪”:数学,罪, “cos”:math.cos, “tan”:math.tan, “exp”:math.exp, “abs”:abs, #新增函数,从统计导入平均值 “平均”:平均, “trunc”:λa:int(a), “圆”:圆, “sgn”:λa:-1如果aepsilon else 0, } mean函数以iterable对象作为参数,但显然语法需要扩展
fn={
“罪”:数学,罪,
“cos”:math.cos,
“tan”:math.tan,
“exp”:math.exp,
“abs”:abs,
#新增函数,从统计导入平均值
“平均”:平均,
“trunc”:λa:int(a),
“圆”:圆,
“sgn”:λa:-1如果a<-epsilon else 1如果a>epsilon else 0,
}
mean函数以iterable对象作为参数,但显然语法需要扩展以识别列表文字。当我尝试测试它时:
测试(“平均值([2,5,6])”,平均值([2,5,6]))
我得到以下错误:
mean([2,5,6])评估失败:应为{{{{{{{{{{{W:(ABCD…,ABCD…)
抑制:(“(”)-}组:(转发:无)[,组:(转发:
无)]…)}抑制:(“”“)}|“PI”}|“E”}| Re:('[+-]?\\d+(?:\\.\\d*))?(?:
[eE][+-]?\\d+)}W:(ABCD…,ABCD…}组:({抑制:(“(”):
…}Suppress:(“””)},找到“[”(在字符5处),(第1行,第6列)[]
我已尝试为列表添加语法定义:
nlist=“[”+分隔符列表(组(expr))+“]”“
并修改了fn_呼叫定义:
fn_call=(ident+lpar-Group(expr_list | nlist)+rpar)(
lambda t:t.insert(0,(t.pop(0),len(t[0]))
)
这仅返回以下错误:
mean([2,5,6])评估失败:从空列表中弹出['2','5','6',('mean',5)]
所以,我想我对nlist的定义不太正确。有什么建议可以让它发挥作用吗
谢谢Untested,但是请尝试
LBRACK,RBRACK=map(Suppress,“[]”);nlist=Group(LBRACK+delimitedList(expr)+RBRACK)
。您在delimitedList中分组,确实希望对整个列表进行分组。然后,不要将nlist添加到fn_调用的定义中,而是将其添加为atom的另一个替代方法:((fn|u call | pi | e | fnumber | ident | nlist)
)。这应该允许您编写类似于“[1,2,3]*3”的内容。感谢您的回复。这些更改最终会导致类似的错误:平均值([2,5,6])计算失败:'in'需要字符串作为左操作数,而不是解析结果['2',5',6',(['2',5',6',6',6',('mean',1],('mean',1)]
FWIW,第一个异常在parseImpl()方法的class\u SingleCharLiteral(Literal)
中的第2883行生成。它显然希望看到“+”字符,但没有,因为instring[loc]是“mean”的第一个字符。OTOH,至少现在它正确地确定mean接受1个参数。:-)未测试,但请尝试LBRACK,RBRACK=map(Suppress,“[]”);nlist=Group(LBRACK+delimitedList(expr)+RBRACK)
。您在delimitedList中分组,确实希望对整个列表进行分组。然后,不要将nlist添加到fn_调用的定义中,而是将其添加为atom的另一个替代方法:((fn|u call | pi | e | fnumber | ident | nlist)
)。这应该允许您编写类似于“[1,2,3]*3”的内容。感谢您的回复。这些更改最终会导致类似的错误:平均值([2,5,6])计算失败:'in'需要字符串作为左操作数,而不是解析结果['2',5',6',(['2',5',6',6',6',('mean',1],('mean',1)]
FWIW,第一个异常在parseImpl()方法的class\u SingleCharLiteral(Literal)
中的第2883行生成。它显然希望看到“+”字符,但没有,因为instring[loc]是“mean”的第一个字符。OTOH,至少现在它正确地确定mean接受1个参数。:-)