Improve/fix filtering SyntaxWarnings by module
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:
| 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 | |
| ); |
| _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