Пример fourFn.py из pyparsing содержит словарь, в котором перечислены все поддерживаемые функции. Я пытаюсь добавить определение для вызова функции среднего значения статистики:
fn = {
"sin": math.sin,
"cos": math.cos,
"tan": math.tan,
"exp": math.exp,
"abs": abs,
# added function, mean imported from statistics
"mean": mean,
"trunc": lambda a: int(a),
"round": round,
"sgn": lambda a: -1 if a < -epsilon else 1 if a > epsilon else 0,
}
Функция среднего значения принимает итеративный объект в качестве аргумента, но, очевидно, грамматику необходимо расширить для распознавания литерала списка. Когда я пытаюсь проверить это:
test("mean([2, 5, 6])", mean([2, 5, 6]))
я получаю следующую ошибку:
mean([2, 5, 6]) failed eval: Expected {{{{{{{{W:(ABCD..., ABCD...)
Suppress:("(") -} Group:(Group:(Forward: None) [, Group:(Forward:
None)]...)} Suppress:(")")} | "PI"} | "E"} | Re:('[+-]?\\d+(?:\\.\\d*)?(?:
[eE][+-]?\\d+)?')} | W:(ABCD..., ABCD...)} | Group:({{Suppress:("(") :
...} Suppress:(")")})}, found '[' (at char 5), (line:1, col:6) []
Я попытался добавить определение грамматики для списка:
nlist = "[" + delimitedList(Group(expr)) + "]"
И изменил определение fn_call:
fn_call = (ident + lpar - Group(expr_list | nlist) + rpar).setParseAction(
lambda t: t.insert(0, (t.pop(0), len(t[0])))
)
Это только возвращает эту ошибку:
mean([2, 5, 6]) failed eval: pop from empty list ['2', '5', '6', ('mean', 5)]
Итак, я думаю, я не не имеет определения nlist совершенно верно. Любые предложения о том, как я мог бы заставить это работать?
Спасибо