This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2012年11月01日 14:16 by pelson, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| pelson_warnings_fix.diff | pelson, 2012年11月01日 14:16 | Lib/warnings.py, Python/_warnings.c & Lib/test/test_warnings.py changes (vn 1) | review | |
| pelson_warnings_fix_2.diff | pelson, 2012年11月20日 16:57 | Version 2 of the patch | review | |
| pelson_warnings_fix_3.diff | pelson, 2012年11月22日 10:43 | Version 3 of the patch (Minor review actions from Berker Peksag) | review | |
| pelson_warnings_fix_4.diff | pelson, 2013年03月04日 13:09 | review | ||
| issue16382_v5.diff | berker.peksag, 2014年06月24日 18:31 | review | ||
| Messages (5) | |||
|---|---|---|---|
| msg174421 - (view) | Author: Phil Elson (pelson) * | Date: 2012年11月01日 14:16 | |
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):
>>> import test.support
>>> py_warnings = test.warnings = test.support.import_fresh_module('warnings', blocked=['_warnings'])
>>> c_warnings = test.support.import_fresh_module('warnings', fresh=['_warnings'])
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!
|
|||
| msg183443 - (view) | Author: Phil Elson (pelson) * | Date: 2013年03月04日 13:09 | |
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, |
|||
| msg221478 - (view) | Author: Berker Peksag (berker.peksag) * (Python committer) | Date: 2014年06月24日 18:31 | |
Here's a new patch addressing Ezio's Rietveld comment. I've also used assertRaisesRegex instead of assertRaises in tests. |
|||
| msg222762 - (view) | Author: Berker Peksag (berker.peksag) * (Python committer) | Date: 2014年07月11日 16:51 | |
Thanks for the patch, Phil. |
|||
| msg222763 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2014年07月11日 16:55 | |
New changeset c4a86fe52006 by Berker Peksag in branch 'default': Issue #16382: Improve exception message of warnings.warn() for bad category. http://hg.python.org/cpython/rev/c4a86fe52006 |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:37 | admin | set | github: 60586 |
| 2021年01月11日 20:34:21 | iritkatriel | link | issue21865 superseder |
| 2014年07月11日 16:55:16 | python-dev | set | nosy:
+ python-dev messages: + msg222763 |
| 2014年07月11日 16:51:59 | berker.peksag | set | status: open -> closed type: behavior -> enhancement assignee: berker.peksag nosy: + r.david.murray messages: + msg222762 resolution: fixed stage: patch review -> resolved |
| 2014年06月24日 18:31:18 | berker.peksag | set | files:
+ issue16382_v5.diff nosy: + berker.peksag messages: + msg221478 |
| 2014年01月23日 21:00:03 | berker.peksag | set | versions: + Python 3.5, - Python 3.4 |
| 2013年03月04日 13:09:13 | pelson | set | files:
+ pelson_warnings_fix_4.diff messages: + msg183443 |
| 2012年11月22日 10:43:08 | pelson | set | files: + pelson_warnings_fix_3.diff |
| 2012年11月20日 16:57:23 | pelson | set | files: + pelson_warnings_fix_2.diff |
| 2012年11月02日 19:03:40 | ezio.melotti | set | nosy:
+ ezio.melotti stage: patch review |
| 2012年11月01日 18:05:34 | pitrou | set | nosy:
+ brett.cannon |
| 2012年11月01日 14:16:46 | pelson | create | |