From a964acd51d49a11be773dd6406fd5b889fe3e923 Mon Sep 17 00:00:00 2001 From: Ryan Gonzalez Date: Sat, 18 Jan 2020 16:26:40 -0600 Subject: [PATCH] Avoid evaluating quoted f-strings Fixes #1844. --- hy/compiler.py | 8 +++++++- tests/native_tests/language.hy | 11 ++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/hy/compiler.py b/hy/compiler.py index 48d8af4..3d527f7 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -606,7 +606,13 @@ class HyASTCompiler(object): elif isinstance(form, HyString): if form.is_format: - body.extend([HyKeyword("is_format"), form.is_format]) + # Ensure that this f-string isn't evaluated right now. + body = [ + copy.copy(form), + HyKeyword("is_format"), + form.is_format, + ] + body[0].is_format = False if form.brackets is not None: body.extend([HyKeyword("brackets"), form.brackets]) diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 7732207..903663e 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -1303,7 +1303,16 @@ cee\"} dee" "ey bee\ncee dee")) ; Format bracket strings (assert (= #[f[a{p !r :9}]f] "a'xyzzy' ")) (assert (= #[f-string[result: {value :{width}.{precision}}]f-string] - "result: 12.34"))) + "result: 12.34")) + + ; Quoting shouldn't evaluate the f-string immediately + ; https://github.com/hylang/hy/issues/1844 + (setv quoted 'f"hello {world}") + (assert quoted.is-format) + (with [(pytest.raises NameError)] + (eval quoted)) + (setv world "goodbye") + (assert (= (eval quoted) "hello goodbye"))) (defn test-import-syntax []