Issue 33189: pygettext doesn't work with f-strings
Created on 2018-03-30 20:25 by Riccardo Polignieri, last changed 2022-04-11 14:58 by admin. This issue is now closed.
Messages (8)
msg314712 - (view)
Author: Riccardo Polignieri (Riccardo Polignieri)
Date: 2018-03-30 20:25
Date: 2018-04-01 15:05
Date: 2018-04-01 16:45
Date: 2018-04-17 10:22
Date: 2018-04-19 06:23
Tested (on windows) with python 3.6, but I guess it's the same in py3.7:
# test.py
def hello(x):
print(_(f'hello {x}'))
> py pygettext.py test.py
Traceback (most recent call last):
File "C:\Program Files\Python36\Tools\i18n\pygettext.py", line 623, in <module>
if __name__ == '__main__':
File "C:\Program Files\Python36\Tools\i18n\pygettext.py", line 597, in main
for _token in tokens:
File "C:\Program Files\Python36\Tools\i18n\pygettext.py", line 328, in __call__
## 'tstring:', tstring
File "C:\Program Files\Python36\Tools\i18n\pygettext.py", line 382, in __openseen
elif ttype == tokenize.STRING:
File "C:\Program Files\Python36\Tools\i18n\pygettext.py", line 236, in safe_eval
# unwrap quotes, safely
File "<string>", line 1, in <module>
NameError: name 'x' is not defined
msg314776 - (view)
Author: Stefan Behnel (scoder) *
Date: 2018-04-01 15:05
Is there really a use case for this? I would normally expect place holders to get replaced *after* translation, i.e. in the translated text, not before.msg314780 - (view) Author: Serhiy Storchaka (serhiy.storchaka) *
Date: 2018-04-01 16:45
I agree that pygettext should not and can not support f-strings, but the error should be better. The problem is that an f-string expression is tokenized as literal strings, but eval() can't evaluate it out of context.msg314878 - (view) Author: Riccardo Polignieri (Riccardo Polignieri) Date: 2018-04-03 11:39
> the error should be better
Yes, that's what I maeant - sorry I should have phrased better.
I marked by mistake a couple of f-strings for translation and totally forgot about it for a while... it took me some time to figure out what was going on with this NameError popping out of nowhere.
Curiously, xgettext handles this thing better (...or, far worse actually): it just parses the f-string as a regular one, producing something like
msgid "hello {x}"
msgstr ""
But then of course Python will fail *silently* at runtime, never picking up the translated version of the string...
msg315389 - (view)
Author: Serhiy Storchaka (serhiy.storchaka) *
Date: 2018-04-17 10:22
If there are no objections I'm going to merge PR 6364 in 24 hours.msg315481 - (view) Author: Serhiy Storchaka (serhiy.storchaka) *
Date: 2018-04-19 06:23
New changeset 69524821a87251b7aee966f6e46b3810ff5aaa64 by Serhiy Storchaka in branch 'master': bpo-33189: pygettext.py now accepts only literal strings (GH-6364) https://github.com/python/cpython/commit/69524821a87251b7aee966f6e46b3810ff5aaa64msg315482 - (view) Author: miss-islington (miss-islington) Date: 2018-04-19 06:49
New changeset a4fb580f701df5bf07ce569a4f43abfb05c92759 by Miss Islington (bot) in branch '3.7': bpo-33189: pygettext.py now accepts only literal strings (GH-6364) https://github.com/python/cpython/commit/a4fb580f701df5bf07ce569a4f43abfb05c92759msg315483 - (view) Author: miss-islington (miss-islington) Date: 2018-04-19 07:34
New changeset 6f870935c2e024cbd1cc379f85e6a66d7711dcc7 by Miss Islington (bot) in branch '3.6': bpo-33189: pygettext.py now accepts only literal strings (GH-6364) https://github.com/python/cpython/commit/6f870935c2e024cbd1cc379f85e6a66d7711dcc7
History
Date
User
Action
Args
2022-04-11 14:58:59adminsetgithub: 77370
2018-04-19 07:48:45serhiy.storchakasetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved 2018-04-19 07:34:30miss-islingtonsetmessages: + msg315483 2018-04-19 07:02:04miss-islingtonsetpull_requests: + pull_request6229 2018-04-19 06:49:18miss-islingtonsetnosy: + miss-islington
messages: + msg315482
2018-04-19 06:25:20miss-islingtonsetpull_requests: + pull_request6228 2018-04-19 06:24:25miss-islingtonsetpull_requests: + pull_request6227 2018-04-19 06:23:05serhiy.storchakasetmessages: + msg315481 2018-04-17 10:22:06serhiy.storchakasetassignee: serhiy.storchaka
2018-04-03 15:19:38serhiy.storchakasetkeywords: + patch
stage: patch review
pull_requests: + pull_request6074 2018-04-03 11:39:25Riccardo Polignierisetmessages: + msg314878 2018-04-01 16:45:43serhiy.storchakasetnosy: + eric.smith, serhiy.storchaka
messages: + msg314776
2018-03-30 20:25:16Riccardo Poligniericreate
resolution: fixed
stage: patch review -> resolved 2018-04-19 07:34:30miss-islingtonsetmessages: + msg315483 2018-04-19 07:02:04miss-islingtonsetpull_requests: + pull_request6229 2018-04-19 06:49:18miss-islingtonsetnosy: + miss-islington
messages: + msg315482
2018-04-19 06:25:20miss-islingtonsetpull_requests: + pull_request6228 2018-04-19 06:24:25miss-islingtonsetpull_requests: + pull_request6227 2018-04-19 06:23:05serhiy.storchakasetmessages: + msg315481 2018-04-17 10:22:06serhiy.storchakasetassignee: serhiy.storchaka
messages:
+ msg315389
nosy:
+ lemburg
2018-04-03 15:19:38serhiy.storchakasetkeywords: + patch
stage: patch review
pull_requests: + pull_request6074 2018-04-03 11:39:25Riccardo Polignierisetmessages: + msg314878 2018-04-01 16:45:43serhiy.storchakasetnosy: + eric.smith, serhiy.storchaka
messages:
+ msg314780
versions:
+ Python 3.8
messages: + msg314776
2018-03-30 20:25:16Riccardo Poligniericreate