<br><br><div><span class="gmail_quote">On 5/18/06, <b class="gmail_sendername">tomer filiba</b> &lt;<a href="mailto:tomerfiliba@gmail.com">tomerfiliba@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&gt; Positional support is deprecated; there will only be support for a<br>&gt; single argument. Read<br>&gt; PEP 352 to see how BaseException will end up in Python 3000.<br><br>i don't see how BaseException addresses issues like accessing
<br>attributes rather than positional args, or introducing something equivalent<br>to ArgumentError. raising a TypeError is just semantically wrong in that<br>case -- it has nothing to do with types whatsoever.</blockquote>
<div><br><br>It doesn't address any of that.&nbsp; It isn't meant to.&nbsp; BaseException is the base exception and is not meant to support the kitchen sink.<br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
from the pep:<br>&gt; This PEP proposes introducing a new exception named BaseException<br>&gt; that is a new-style class and has a single attribute, message (that will<br>&gt; cause the deprecation of the existing args attribute)
</blockquote><div><br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">well, how do you suggest passing back the error-code, or file name of
<br>exceptions like IOError, or the attribute name of an AttributeError?<br>a single argument can only be used for pretty printing, not really providing<br>information *about* the exception. so unless people would want to
<br>use regular expressions to *parse* the message, why not allow keyword<br>arguments for extra info about the exception?</blockquote><div><br><br>Subclassing.&nbsp; You can override the constructor and do what you want.<br>&nbsp;
</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">&gt; And I brought this up with Guido once and he was not enthusiastic<br>&gt; about it.&nbsp;&nbsp;Basically, keep exceptions simple.&nbsp;&nbsp;They are important
<br>&gt; and basic enough to keep it simple.&nbsp;&nbsp;If you want fancier support,<br>&gt; subclass Exception and add the support you want.</blockquote><div><br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
well, if guido pronounced on it than i guess it's settled, but why do you<br>condsider *args to be simple and **kwargs not as simple? don't you<br>think &quot;ex.filename&quot; is simpler/clearer than &quot;ex[1]&quot;?</blockquote>
<div><br><br>I do.&nbsp; I am in no way suggesting that positional arguments are better.&nbsp; As I said, positional arguments are not going to be supported in Python 3000.&nbsp; The positional argument support is for backards-compatibility; that's why BaseException will end up having the constructor defined as::
<br><pre class="literal-block">   def __init__(self, message=''):<br>        &quot;&quot;&quot;Set the 'message' attribute'&quot;&quot;&quot;<br>        self.message = message</pre><br>as specified in the PEP.&nbsp; But that does not stop someone from overriding BaseException in a subclass, as some built-ins do already.&nbsp; So you can easily add your filename attribute.::
<br><br>&nbsp; def __init__(self, filename):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.filename = filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BaseException.__init__(self, &quot;%s does not exist&quot; % filename)<br>&nbsp;<br>This also allows you to come up with an informative message if you so desire that is more standardized and based on some other argument.
<br><br>-Brett<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">-tomer<br><br>On 5/17/06, Brett Cannon &lt;<a href="mailto:brett@python.org">
brett@python.org</a>&gt; wrote:<br>&gt;<br>&gt;<br>&gt;<br>&gt; On 5/17/06, tomer filiba &lt;<a href="mailto:tomerfiliba@gmail.com">tomerfiliba@gmail.com</a>&gt; wrote:<br>&gt; &gt; hi all<br>&gt; &gt;<br>&gt; &gt; i would like to suggest changing the base-exception class, whatever
<br>&gt; &gt; it may be (Exception/BaseException) to work with keyword arguments<br>&gt; &gt; instead of positional ones.<br>&gt;<br>&gt;<br>&gt;<br>&gt; Positional support is deprecated; there will only be support for a single
<br>&gt; argument.&nbsp;&nbsp;Read PEP 352 to see how BaseException will end up in Python 3000.<br>&gt;<br>&gt; And I brought this up with Guido once and he was not enthusiastic about it.<br>&gt; Basically, keep exceptions simple.&nbsp;&nbsp;They are important and basic enough to
<br>&gt; keep it simple.&nbsp;&nbsp;If you want fancier support, subclass Exception and add the<br>&gt; support you want.<br>&gt;<br>&gt; -Brett<br>&gt;<br>&gt; &gt;<br>&gt; instead of<br>&gt;<br>&gt; try:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&gt; except IOError, ex:
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; print ex[1]<br>&gt; # or<br>&gt; except IOError, (code, text, filename):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; # which means changes to code/text/filename do not change<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; # the exception object<br>&gt;<br>&gt; use
<br>&gt;<br>&gt; try:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; raise IOError(filename = &quot;lala&quot;, code=17, text=&quot;blah blah blah&quot;)<br>&gt; except IOError, ex:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; ex.code = 18<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; raise<br>&gt;<br>&gt; raise IndexError(&quot;invalid index&quot;, index = the_index)
<br>&gt; raise KeyError(&quot;key not found&quot;, key = the_key)<br>&gt; raise AttributeError(&quot;attribute not found&quot;, name = name)<br>&gt;<br>&gt; where the new exception can be something like<br>&gt;<br>&gt; class Exception:
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, message = None, **kw):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._message = message<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__dict__.update(kw)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; def __repr__(self):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attrs = sorted(&quot;%s = %r&quot; % (k, v)
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k, v in self.__dict__.iteritems()<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not k.startswith(&quot;_&quot;))<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;&lt;%s(%s, %s)&gt;&quot; % (self.__class__.__name__,<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._message, &quot;, &quot;.join(attrs))<br>&gt;<br>&gt; class IOError(Exception):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;pass<br>&gt;<br>&gt; raise IOError(code = 17, text = &quot;EBLAH&quot;, filename = &quot;lalala&quot;)<br>&gt;
<br>&gt; the builtin errors might want to enforce an &quot;exception signature&quot;,<br>&gt;<br>&gt; class ExceptionSignature(Exception):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; attributes = []<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; def __init__(self, *args, **kw):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for name in 
self.attributes:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert name in kw, &quot;expected an attribute named %s&quot; % (name,)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exception.__init__(self, *args, **kw)<br>&gt;<br>&gt; class IOError(ExceptionSignature):<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; attributes = [&quot;code&quot;, &quot;text&quot;, &quot;filename&quot;]
<br>&gt;<br>&gt; or something like that, so the attributes of the exception are part<br>&gt; of its official interface.<br>&gt;<br>&gt; rationale:<br>&gt; * today, AttributeError's are raised as<br>&gt; AttributeError(&quot;%s object has no attribute %s&quot; % ...)
<br>&gt; which means analyzing the exception requires parsing text!<br>&gt;&nbsp;&nbsp;* IOError (among others), for instance, does nasty and not-so-well<br>&gt; documented<br>&gt; overloading of named/positional arguments: when you pass 1-3 arguments,
<br>&gt; they are stored in .args, but also in .errno, .strerror, and<br>&gt;&nbsp;&nbsp;.filename. if you pass<br>&gt; more than 3 arguments, the attributes are all set to None and only<br>&gt; .args is filled.<br>&gt; yuck.<br>&gt;
<br>&gt; you can see this for reference:<br>&gt; <a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496698">http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496698</a><br>&gt;<br>&gt; ----<br>&gt;<br>
&gt; that said, i would also want to introduce ArgumentError. there are<br>&gt; many times just a ValueError isn't enough. instead, having a builtin<br>&gt; ArgumentError would made things more clear:<br>&gt;<br>&gt; def write_to_file(the_file):
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if the_file.closed:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise ArgumentError(&quot;the file must be open&quot;, name = &quot;the_file&quot;)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; the_file.write(...)<br>&gt;<br>&gt; and with ArgumentError included, calling functions with invalid
<br>&gt; signatures would also raise ArgumentError. TypeError is quite<br>&gt; silly in this case, as it has nothing to do with the *type* of<br>&gt; the function or its arguments.<br>&gt;<br>&gt; &gt;&gt;&gt; def f(a): pass
<br>&gt; &gt;&gt;&gt; f(1,2)<br>&gt; Traceback (most recent call last):<br>&gt;&nbsp;&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in ?<br>&gt; *TypeError*: f() takes exactly 1 argument (2 given)<br>&gt; &gt;&gt;&gt; type(f)<br>&gt; &lt;type 'function'&gt; # like any other function
<br>&gt;<br>&gt; TypeError is too-broadly overloaded this way.<br>&gt;<br>&gt;<br>&gt; -tomer<br>&gt; _______________________________________________<br>&gt; Python-3000 mailing list<br>&gt;&nbsp;&nbsp;<a href="mailto:Python-3000@python.org">
Python-3000@python.org</a><br>&gt; <a href="http://mail.python.org/mailman/listinfo/python-3000">http://mail.python.org/mailman/listinfo/python-3000</a><br>&gt; Unsubscribe:<br>&gt; <a href="http://mail.python.org/mailman/options/python-3000/brett%40python.org">
http://mail.python.org/mailman/options/python-3000/brett%40python.org</a><br>&gt;<br>&gt;<br></blockquote></div><br>