pyparsing - расширение примера fourFn.py с помощью функции - PullRequest
1 голос
/ 05 марта 2020

Пример 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 совершенно верно. Любые предложения о том, как я мог бы заставить это работать?

Спасибо

...