Repository navigation
Improve/fix filtering SyntaxWarnings by module #135801
Description
Feature or enhancement
Proposal:
Syntax warnings during AST parsing use _PyCompile_Warn to setup their warning context automatically. Though the filename is correct, the module is inferred and often not helpful. This is especially an issue when trying to ignore specific errors in a CI environment with pytest where the module is suddenly importlib._bootstrap. In other cases with python alone it's often just sys.
AFAICT this applies mainly to the "is" with '...' literal and 'return' in 'finally' block warnings.
--
To reproduce
# test.py
class A:
def __init__(self):
self.var = 2
def func(self) -> bool:
return self.var is 2./python.exe -W error::SyntaxWarning:sys test.py File "/.../test.py", line 7
return self.var is 2
^^^^^^^^^^^^^
SyntaxError: "is" with 'int' literal. Did you mean "=="?Note: The SyntaxWarning is changed to an error for module sys where test would have been the expected module.
--
The SyntaxWarning is triggered here:
Lines 1831 to 1837 in b14986c
| const char *msg = (op == Is) | |
| ? "\"is\" with '%.200s' literal. Did you mean \"==\"?" | |
| : "\"is not\" with '%.200s' literal. Did you mean \"!=\"?"; | |
| expr_ty literal = !left ? left_expr : right_expr; | |
| return _PyCompile_Warn( | |
| c, LOC(e), msg, infer_type(literal)->tp_name | |
| ); |
Lines 1204 to 1214 in b14986c
| _PyCompile_Warn(compiler *c, location loc, const char *format, ...) | |
| { | |
| va_list vargs; | |
| va_start(vargs, format); | |
| PyObject *msg = PyUnicode_FromFormatV(format, vargs); | |
| va_end(vargs); | |
| if (msg == NULL) { | |
| return ERROR; | |
| } | |
| int ret = _PyErr_EmitSyntaxWarning(msg, c->c_filename, loc.lineno, loc.col_offset + 1, | |
| loc.end_lineno, loc.end_col_offset + 1); |
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response
Linked PRs
- gh-135801: Fix inaccurate module info for SyntaxWarnings during AST parsing #135829
- gh-135801: Add the module parameter to compile() etc #139652
- gh-135801: Improve filtering by module in warn_explicit() without module argument #140151
- gh-135801: Add tests for filtering warnings by module #140240
- [3.14] gh-135801: Add tests for filtering warnings by module (GH-140240) #140246
- [3.13] gh-135801: Add tests for filtering warnings by module (GH-140240) #140247
Activity
serhiy-storchaka commentedon Oct 6, 2025
This is a difficult issue. I have spent past three days on it, and may require other three days or week. I think there will be three PRs:
moduleparameter incompile()and other functions and passing the module name if possible. This is the only reliable way to get the correct module name for syntax warnings in the imported module. This is a new feature, because it adds new parameters and the caller code needs to be changed to utilize this. gh-135801: Add the module parameter to compile() etc #139652:). The idea is to try to match multiple names starting from different path components. This can potentially be backported to 3.14, although we will need to change the documented behavior. But the current behavior is too poor. gh-135801: Improve filtering by module in warn_explicit() without module argument #140151pythongh-135801: Add the module parameter to compile() etc
pythongh-135801: Add the module parameter to compile() etc
pythongh-135801: Improve filtering by module in warn_explicit() witho…
pythongh-135801: Improve filtering by module in warn_explicit() witho…
pythongh-135801: Add the module parameter to compile() etc
pythongh-135801: Improve filtering by module in warn_explicit() witho…
serhiy-storchaka commentedon Oct 16, 2025
#140151 improves heuristic if module is not passed in
warn_explicit(), and #139652 adds the module argument incompile()and similar functions.pythongh-135801: Add tests for filtering warnings by module
serhiy-storchaka commentedon Oct 17, 2025
PR #140240 adds tests for filtering by module in
warn_explicit(), and #140241 is a separate issue for documentation ofwarn_explicit().2 remaining items
pythongh-135801: Add tests for filtering warnings by module (pythonGH…
pythongh-135801: Add tests for filtering warnings by module (pythonGH…
[3.14] gh-135801: Add tests for filtering warnings by module (GH-140240…
[3.13] gh-135801: Add tests for filtering warnings by module (GH-140240…
gh-135801: Improve filtering by module in warn_explicit() without mod…
cdce8p commentedon Oct 30, 2025
@serhiy-storchaka Thanks for your work on this one and the
ast.parseissue! It's much appreciated. I just tested the changes from #140151. The issue I described in the OP is now resolved AFACIT. Both the warnings filter with the-Wflag as well as the pytest warnings filter do work as I'd expect them too now.I saw you mentioned it in #140151 (comment) already but I do agree this would be great to have in
3.14.1as well.I'm not sure it fully solves all issue discussed around PEP 765 but IMO it definitely improves the situations considerably.
Thanks again!
serhiy-storchaka commentedon Oct 31, 2025
Note that if you have modules
foo.barandbar, a filter forbarwill also matchfoo.bar. #139652 will make filtering more accurate.gh-135801: Add the module parameter to compile() etc (GH-139652)
Merge branch 'main' into fix-issue21914
Merge branch 'main' of github.com:python/cpython into fix-Issue18387
Merge branch 'main' of github.com:python/cpython into fix-issue24255
pythongh-135801: Add tests for filtering warnings by module (pythonGH…
pythongh-135801: Improve filtering by module in warn_explicit() witho…
pythongh-135801: Add the module parameter to compile() etc (pythonGH-…