Merge pull request #1868 from refi64/f-string-quote

Avoid evaluating quoted f-strings
This commit is contained in:
Kodi Arfer 2020-04-02 08:40:20 -04:00 committed by GitHub
commit 5c9f04021e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 3 deletions

View File

@ -12,6 +12,7 @@ Bug Fixes
------------------------------ ------------------------------
* Improved support for nesting anaphoric macros by only applying * Improved support for nesting anaphoric macros by only applying
symbol replacement where absolutely necessary. symbol replacement where absolutely necessary.
* Quoted f-strings are no longer evaluated prematurely.
0.18.0 0.18.0
============================== ==============================

View File

@ -606,9 +606,15 @@ class HyASTCompiler(object):
elif isinstance(form, HyString): elif isinstance(form, HyString):
if form.is_format: 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: if form.brackets is not None:
body.extend([HyKeyword("brackets"), form.brackets]) body.extend([HyKeyword("brackets"), form.brackets])
ret = HyExpression([HySymbol(name)] + body).replace(form) ret = HyExpression([HySymbol(name)] + body).replace(form)
return imports, ret, False return imports, ret, False

View File

@ -1303,7 +1303,16 @@ cee\"} dee" "ey bee\ncee dee"))
; Format bracket strings ; Format bracket strings
(assert (= #[f[a{p !r :9}]f] "a'xyzzy' ")) (assert (= #[f[a{p !r :9}]f] "a'xyzzy' "))
(assert (= #[f-string[result: {value :{width}.{precision}}]f-string] (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 [] (defn test-import-syntax []