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
Better warnings exception for bad category #60586
Comments
When passing an invalid Warning subclasses to the warnings.warn function, a bare issubclass exception is raised: >>> import warnings
>>> warnings.warn('hello world', 'not a valid warning type')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class This exception is consistent accross both Python/_warnings.c and Lib/warnings.py implementations, but I feel it could be more helpful/explicit about the nature problem. To test both cases I have been using the following code (python3.4):
Now: >>> py_warnings.warn('hello world', '')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lib/python3.4/warnings.py", line 168, in warn
assert issubclass(category, Warning)
TypeError: issubclass() arg 1 must be a class
>>> c_warnings.warn('hello world', '')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class Additionally, there is a difference in the denotational semantics of None between the c and py warnings implementation: >>> py_warnings.warn('Hello world', None)
__main__:1: UserWarning: Hello world
>>> c_warnings.warn('Hello world', None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class I can understand that python does not allow the concept of an optional positional arguments and therefore it is arguable that the signatures of the two functions are inevitably going to be different. I defer to someone more knowledgeable in Python to decide if this is a problem, and whether it should be made consistent. Attached is a patch to address these two issues, with associated tests. Please review (n.b. I am a python developer at heart, and only dabble in C when I have to, so extra scrutiny on the C would be valuable to me) and I'd be happy to get any necessary changed applied to the patch asap. In short, as a result of applying this patch, the following results ensue: >>> py_warnings.warn('hello world', '')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lib/python3.4/warnings.py", line 175, in warn
'Got {!r}'.format(Warning, category)) from None
ValueError: category must be a subclass of <class 'Warning'>.Got ''
>>> c_warnings.warn('hello world', '')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: category must be a subclass of <class 'Warning'>. Got ''.
>>>
>>> c_warnings.warn('hello world', None)
__main__:1: UserWarning: hello world Thanks! |
Ok. I think I've done all of the actions from the reviews. I'm not sure if I should remove the old patches or not? Thanks, |
Here's a new patch addressing Ezio's Rietveld comment. I've also used assertRaisesRegex instead of assertRaises in tests. |
Thanks for the patch, Phil. |
New changeset c4a86fe52006 by Berker Peksag in branch 'default': |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: