[Python-Dev] Re: PEP 282 comments
Jeremy Hylton
jeremy@zope.com
Fri, 22 Mar 2002 11:38:55 -0500
>>>>> "VS" == Vinay Sajip <vinay_sajip@red-dove.com> writes:
VS> But I think we all neglected to see that by implementing
VS> exception with one extra argument, the whole controversy goes
VS> away. Just remove logException and change exception so that it
VS> becomes
VS> def exception(self, level, msg, *args):
VS> """Use when handling an exception""" if
VS> self.enabledFor(level):
VS> self.log(level, 1, msg, args)
VS> We've effectively renamed logException() as exception(). There's
VS> not a lot to choose between
VS> logger.exception(INFO, msg, args)
VS> and
VS> logger.exception(msg, args)
VS> If people can't stomach having to put the level into every call
VS> to exception, then we can keep exception as it was [syntactic
VS> sugar] and reintroduce logException (perhaps change the name,
VS> it's a bit of a sore thumb).
The thing I like best about PEP 282 is the method names that indicate
the log levels. While it's just a convenience, it's a handy one. It
saves me having to explicitly manage my namespace to make those names
visible. The Zope code base is littered with
"from zLOG import LOG, INFO, DEBUG"
lines. If I find a place where I need to add a TRACE message, I have
to remember to check the import line to see if that name is bound.
I've forgotton on more than one occasion, and since it's on an unusual
code path, I don't find out until it fails at runtime.
Now we can just use "import zLOG" and name everything explicitly, but
that makes for a lot of extra typing:
zLOG.LOG("Channel", zLOG.TRACE, "a trace message", exc=sys.exc_infO())
Now this is only a minor annoyance, but I'd be happier with the
shorter and equally clear version
log.trace("a trace message", exc=sys.exc_info())
VS> If any more syntactic sugar is wanted, then I think it's
VS> reasonable for people to roll their own classes.
I guess the question is how many users want this. If many users like
this feature, we end up forcing everyone to roll their own classes. I
don't have a good intuition about what the typical user of a logging
module will want. Can log4j teach us anything?
VS> some users want to use their own levels, no doubt for their own
VS> good reasons. The current implementation supports this. They can
VS> use log() and logException(), but debug(), info(), warn(),
VS> error(), fatal() and exception() are useless to them - and so
VS> exposed as the syntactic sugar they really are. So if users
VS> really want, they can define a level BAD_HAIR_DAY and a
VS> corresponding sugar method bad_hair_day(self, msg, *args) which
VS> calls either log() or logException(), as they please. It's not a
VS> job for the standard module, I'm sure all would agree.
I agree. I also expect that most users will just use the standard
levels.
Jeremy