Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test added in gh-104067 has an fstring with an invalid escape sequence #105784

Closed
mattip opened this issue Jun 14, 2023 · 10 comments
Closed

test added in gh-104067 has an fstring with an invalid escape sequence #105784

mattip opened this issue Jun 14, 2023 · 10 comments
Labels
type-bug An unexpected behavior, bug, or error

Comments

@mattip
Copy link
Contributor

mattip commented Jun 14, 2023

Bug report

In response to #104049, a fix and a new test were added in #104067 and related PRs. The test in test_httpserver.py uses an fstring with an escape sequence, but does not use r:

f'listing for {self.base_url}/\?x=123'

I think the code (in two places) should be include an r: fr'listing for ...

On PyPy this is causing the test___all__.py test to fail, since it emits a warning when compiling the *.py to *.pyc. I am not sure why CPython is not seeing a similar problem. Perhaps compileall is run first? Or the warning filter captures the compilation as well as the import?

Your environment

  • CPython versions tested on: PyPy3.9 HEAD using stdlib 3.9.17
  • Operating system and architecture: any
@mattip mattip added the type-bug An unexpected behavior, bug, or error label Jun 14, 2023
@terryjreedy
Copy link
Member

@mattip CPython does not issue this warning SyntaxWarning: invalid escape sequence '\?' until 3.12, though only for normal strings. What warning is PyPy3.9 emitting? (Note: try to minimize reproducing examples, as I did below ;-)

@pablogsal In 3.12 and 3.13, f-strings are not warning about invalid escapes that get warnings in real strings. This seems like a bug.

>>> f'\?'
'\\?'
>>> len(f'\?')
2
>>> '\?'
<stdin>:1: SyntaxWarning: invalid escape sequence '\?'
'\\?'

@mattip
Copy link
Contributor Author

mattip commented Jun 14, 2023

On python3.9.17 from Ubuntu, I get this

$ python3.9 -Walways -c "abc = 'abc'; print(f'listing for {abc}/\?x=123')"
<string>:1: DeprecationWarning: invalid escape sequence \?
listing for abc/\?x=123

@mattip
Copy link
Contributor Author

mattip commented Jun 14, 2023

Adding an r makes it run without a warning

$ python3.9 -Walways -c "abc = 'abc'; print(fr'listing for {abc}/\?x=123')"
listing for abc/\?x=123

@terryjreedy
Copy link
Member

Security patch #104067 was backported to 3.7, which is why it affects PyPy3.9.

@ethanfurman @JelleZijlstra Do the tests added in #104067 require invalid escapes without an 'r' prefix? Or could the escape be changed or the 'r' added?

@pablogsal pablogsal assigned lysnikolaou and unassigned lysnikolaou Jun 14, 2023
@pablogsal
Copy link
Member

@pablogsal In 3.12 and 3.13, f-strings are not warning about invalid escapes that get warnings in real strings. This seems like a bug.

Fixed!

@mattip
Copy link
Contributor Author

mattip commented Jun 15, 2023

Thanks. I see that was backported to 3.12. I am curious why not backport it to all versions that contain the test added in #104067 (maybe excepting ones that will no longer be released)? People running the test without precompiling pyc files will see a DeprecationWarning, no?

Edit: GAA, I didn't actually look at the fix: #105800 is not what I expected.

@mattip
Copy link
Contributor Author

mattip commented Jun 15, 2023

Try as I might, I cannot get CPython3.9 to emit a DeprecationWarning in the test_httpservers.py test. So I will add the r in the PyPy port of the stdlib tests. I am not sure why the test does not emit the warning on CPython3.9, since the f-string needs an r if run outside the test, but 🤷

$ python3.9 -Walways -c "abc = 'abc'; print(f'listing for {abc}/\?x=123')"
<string>:1: DeprecationWarning: invalid escape sequence \?
listing for abc/\?x=123

@pablogsal
Copy link
Member

pablogsal commented Jun 15, 2023

Relevant: #105821

@lysnikolaou
Copy link
Member

This can be closed. @mattip An r prefix has been added in #105822.

@lazka
Copy link
Contributor

lazka commented Jun 23, 2023

Here it only warned/failed when bytecompile was needed, so if there wasn't a .pyc file already for test_httpservers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

6 participants
@mattip @lazka @pablogsal @terryjreedy @lysnikolaou and others