[Python-Dev] Warnings PEP
Sun, 5 Nov 2000 22:24:27 -0800 (PST)
This PEP describes a generalized warning mechanism for Python 2.1. The
primary purpose of this mechanism is to alert the programmer or user
of a program to potential or likely errors which, for whatever reason,
are not considered exception-worthy. For example, this might be done
to keep old code working during a transitional period or to alert the
programmer or user of a recoverable error.
assert >> cls, test[[[, arg], arg]...]
"cls" may be any callable object that takes a list as a single
argument argument list and returns an object with the required
attributes "get_action" and "format_message"
* get_action() -> "warn"|"error"|"suppress"
* format_message() -> string
A provided base class implements these methods in a reusable
fashion. Warning creators are encouraged to merely subclass.
This extended form of the assertion statement calls the assertion
handler code in the new "assertions" module.
The semantics of the built-in assertion handler are defined by the
following code. It should be exposed in a new "assertions" module.
def handle_assertion(cls, message = ""):
"This code is called when an assertion fails and cls is not None"
obj = cls(message)
action = obj.get_action()
*** existing assertion code ***
assert action in ["warn","error","suppress"]
Even if handle_assertion is implemented in C, it should be exposed as
assertions.handle_assertion so that it may be overriden.
The generic warning base class is defined below:
def __init__(self, *args):
if len(args) == 1:
self.args = args
self.args = args
sys.stderr.write("%s: %s" %(obj.__name__, self.args))
def get_user_request(self, cls):
if cls.__name__ in sys.errors:
elif cls.__name__ in sys.warnings:
elif cls.__name__ in sys.disabled_warnings:
for base in cls.__bases__:
rc = self.get_user_request(base)
The Assertion class should be implemented in Python so that it can be
used as a base class.
Because this code inherently implements "warning state inheritance",
it would be rare to override any of the methods, but this is possible
in exceptional circumstances.
By default the special variables have the following contents:
sys.warnings = 
sys.errors = 
sys.suppress = 
sys.default_warning_action = "warn"
These variables may be changed from the command line. The command line
arguments are interpreted as described below:
-w XXX => sys.warnings.append("XXX")
-e XXX => sys.errors.append("XXX")
-no-w XXX => sys.suppress.append("XXX")
-wall => sys.default_warning_action => "warn"
-eall => sys.default_warning_action => "error"
-no-wall => sys.default_warning_action => "suppress"
As per the code above, errors take precedence over warnings and
warnings over suppressions unless a particular assertion class
Built-in warning objects:
"An exception was ignored in an __del__ method"
"This feature may be removed in a future version of Python."
"There is a common error associated with this feature."
These class definitions are part of the "Assertion" module. They
should only ever be used when there exists a way for the programmer to
accomplish the same thing without triggering the warning. For instance
the way to suppress the deletion exception is to trap exceptions in
__del__ methods with a try/except block.