Closed
Description
The pure-Python implementation of the warnings.warn_explicit()
function does this:
msg = WarningMessage(message, category, filename, lineno, source)
But the 5th argument of WarningMessage
is file
(the file the message is supposed to be printed into), not source
("the destroyed object which emitted a ResourceWarning
").
Here's how to reproduce the bug:
>>> import sys, importlib, warnings >>> warnings.warn_explicit('eggs', UserWarning, 'eggs.py', 42, source=object()) eggs.py:42: UserWarning: eggs Object allocated at (most recent call last): File "<stdin>", lineno 1 >>> # so far so good; now let's try the same with pure-Python implementation >>> sys.modules['_warnings'] = None >>> importlib.reload(warnings) <module 'warnings' from '/usr/lib/python3.12/warnings.py'> >>> warnings.warn_explicit('eggs', UserWarning, 'eggs.py', 42, source=object()) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.12/warnings.py", line 413, in warn_explicit _showwarnmsg(msg) File "/usr/lib/python3.12/warnings.py", line 115, in _showwarnmsg _showwarnmsg_impl(msg) File "/usr/lib/python3.12/warnings.py", line 30, in _showwarnmsg_impl file.write(text) ^^^^^^^^^^ AttributeError: 'object' object has no attribute 'write'