Вот грязное решение для #expr
выражений: я обнаружил, что многие выражения с '#expr' имеют одно и то же имя функции с библиотекой math
. Затем я использую eval
, чтобы получить значение с помощью следующей функции:
import wikitextparser as wtp
import math
import re
def parserfunc_2_value(val='{{#expr: 1/3 round 5 }}'):
eq = wtp.parse(val).parser_functions[0].arguments[0].value
filter_pattern = [['([\d\*\/\+\-\s]*)?(round|div|mod)([\d\*\/\+\-\s]*)',r'\2(\1,\3)'],
['(trunc|abs|exp|ln|sin|cos|tan|acos|asin|atan)([\d\*\/\+\-\s]*)',r'\1(\2)'],
['ln\(([\d\*\/\+\-\s]*)\)',r'log(\1)']]
for ptn,rep in filter_pattern:
eq = re.sub(ptn,rep,eq)
return eval(eq)
parserfunc_2_value()
Эта функция, кажется, способна обрабатывать большинство простых шаблонов для #expr
, вот несколько примеров:
>>> parserfunc_2_value('{{#expr: 1/3 round 5 }}')
0.33333
>>> parserfunc_2_value('{{#expr: 1+4 }}')
5