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.

classification
Title: logging module crashes in Python 2.7.3 for handler.setLevel(long)
Type: enhancement Stage: resolved
Components: Library (Lib) Versions: Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: eric.araujo, pitrou, python-dev, tobin.baker, vinay.sajip
Priority: normal Keywords:

Created on 2012-08-16 21:33 by tobin.baker, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Messages (7)
msg168418 - (view) Author: Tobin Baker (tobin.baker) Date: 2012-08-16 21:33
I'm using a 3rd-party library (ESAPI) which defines a log level as the literal -2**31. This worked fine until I upgraded to Python 2.7.3, which, unlike all previous versions of Python, coerces that literal to long rather than int. The following code in the logging module then throws a TypeError:

def _checkLevel(level):
    if isinstance(level, int):
        rv = level
    elif str(level) == level:
        if level not in _levelNames:
            raise ValueError("Unknown level: %r" % level)
        rv = _levelNames[level]
    else:
        raise TypeError("Level not an integer or a valid string: %r" % level)
    return rv

Although this is certainly an unusual use case, it seems that as just a matter of principle, the module should be using the check isinstance(level, (int, long)) rather than just isinstance(level, int).

Here's the relevant part of the traceback:

  File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
    self.level = _checkLevel(level)
  File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel
    raise TypeError("Level not an integer or a valid string: %r" % level)
TypeError: Level not an integer or a valid string: -2147483648L
msg169018 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2012-08-24 13:56
I don't feel it would be correct to allow long for log levels, since a log level is not intended to have that range. It would be more sensible to get the ESAPI developers to use a more appropriate boundary value; in general, negative log values are not used (they are not necessary).
msg169019 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-08-24 13:59
This seems to miss the point that it's a regression. int and long are supposed to be interchangeable for most purposes.
msg169069 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2012-08-24 18:53
type(-2**31) is long for 2.5 and 2.6 as well as 2.7. The check was added as a response to #6314, to catch incorrect values being passed as levels.

It could be argued that -2**31 is not a sensible log level. While int and long are supposed to be interchangeable for most purposes, isn't this a reasonable case where you shouldn't need to support long? If you feel not, what scenarios do you believe lie outside the "most purposes"?
msg169073 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-08-24 19:09
> type(-2**31) is long for 2.5 and 2.6 as well as 2.7. The check was
> added as a response to #6314, to catch incorrect values being passed
> as levels.

Well, what is an incorrect value and why would you bother refusing long?
And how about small long values (e.g. long(0))?
msg169077 - (view) Author: Vinay Sajip (vinay.sajip) * (Python committer) Date: 2012-08-24 19:27
It's not that big a deal, and doesn't matter for 3.x anyway. It just doesn't seem quite right, so I'll make the change soon.
msg169378 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2012-08-29 13:34
New changeset 8ba6d8fc9740 by Vinay Sajip in branch '2.7':
Closes #15710: accept long in _checkLevel.
http://hg.python.org/cpython/rev/8ba6d8fc9740
History
Date User Action Args
2022-04-11 14:57:34adminsetgithub: 59915
2012-08-29 13:34:07python-devsetstatus: open -> closed

nosy: + python-dev
messages: + msg169378

resolution: not a bug -> fixed
stage: resolved
2012-08-24 19:27:06vinay.sajipsetmessages: + msg169077
2012-08-24 19:09:21pitrousetmessages: + msg169073
2012-08-24 18:53:48vinay.sajipsetmessages: + msg169069
2012-08-24 13:59:19pitrousetstatus: pending -> open
nosy: + pitrou
messages: + msg169019

2012-08-24 13:56:10vinay.sajipsetstatus: open -> pending
type: crash -> enhancement
resolution: not a bug
messages: + msg169018
2012-08-17 17:51:08eric.araujosetnosy: + eric.araujo
2012-08-16 21:34:52pitrousetnosy: + vinay.sajip
2012-08-16 21:33:58tobin.bakercreate