Skip to content

Commit 0eb6c5a

Browse files
Merge pull request #63 from laurence-hudson-mindfoundry/master
Make string literal quote types configurable
2 parents 7962872 + b9fe701 commit 0eb6c5a

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

py_expression_eval/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ def append(self, a, b):
329329
a.append(b)
330330
return a
331331

332-
def __init__(self):
332+
def __init__(self, string_literal_quotes = ("'", "\"")):
333+
self.string_literal_quotes = string_literal_quotes
334+
333335
self.success = False
334336
self.errormsg = ''
335337
self.expression = ''
@@ -662,7 +664,7 @@ def isString(self):
662664
r = False
663665
str = ''
664666
startpos = self.pos
665-
if self.pos < len(self.expression) and self.expression[self.pos] in ("'", "\""):
667+
if self.pos < len(self.expression) and self.expression[self.pos] in self.string_literal_quotes:
666668
quote_type = self.expression[self.pos]
667669
self.pos += 1
668670
while self.pos < len(self.expression):

py_expression_eval/tests.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def test_parser(self):
3232

3333
# but '"a b"' can *not* be used as a variable
3434
self.assertEqual(parser.parse('"a b"*2').evaluate({'"a b"': 2}), "a ba b")
35+
# unless parse configured to allow double quoted variables (i.e. allow multi-word vars)
36+
parser2 = Parser(string_literal_quotes=("'")) # only single, not double!
37+
self.assertEqual(parser2.parse('"a b"*2').evaluate({'"a b"':2}),4)
3538

3639
# evaluate
3740
self.assertExactEqual(parser.parse('1').evaluate({}), 1)
@@ -215,15 +218,31 @@ def test_custom_functions_with_inline_strings(self):
215218
expr = parser.parse("func(1, \"func(2, 4)\")")
216219
self.assertEqual(expr.variables(), ['func'])
217220

221+
expr = parser.parse("func(1, 'func(2, 4)')")
222+
self.assertEqual(expr.variables(), ['func'])
223+
224+
parser2 = Parser(string_literal_quotes=("'"))
225+
expr = parser2.parse("func(1, \"func(2, 4)\")")
226+
self.assertEqual(expr.variables(), ['func', "\"func(2, 4)\""])
227+
228+
expr = parser2.parse("func(1, 'func(2, 4)')")
229+
self.assertEqual(expr.variables(), ['func'])
230+
218231
def test_custom_functions_substitute_strings(self):
219232
def func(var, str):
220233
if str == "custom text":
221234
return 1
235+
if str == "foo":
236+
return 2
222237
return 0
223238

224239
parser = Parser()
225240
expr = parser.parse("func(1, \"custom text\")")
226241
self.assertEqual(expr.evaluate({"func": func}), 1)
242+
243+
parser = Parser(string_literal_quotes=("'"))
244+
expr = parser.parse("func(1, \"custom text\")")
245+
self.assertEqual(expr.evaluate({"func": func, "\"custom text\"": "foo" }), 2)
227246

228247
def test_decimals(self):
229248
parser = Parser()

0 commit comments

Comments
 (0)