Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyparsing——使用函数扩展fourFn.py示例_Python_Pyparsing - Fatal编程技术网

Python 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对象作为参数,但显然语法需要扩展

pyparsing中的fourFn.py示例有一个字典,其中列出了所有支持的函数。我试图添加一个定义来调用统计平均值函数:

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个参数。:-)