<br><br><div><span class="gmail_quote">On 3/14/07, <b class="gmail_sendername">Neal Norwitz</b> &lt;<a href="mailto:nnorwitz@gmail.com">nnorwitz@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;">
---------- Forwarded message from python-3000-checkins ----------<br><br>Neal Norwitz schrieb:<br>&gt; I assume this is not the desired behaviour?<br>&gt;<br>&gt;&gt;&gt;&gt; class F:<br>&gt; ...&nbsp;&nbsp; def __dir__(self):<br>&gt; ...&nbsp;&nbsp;&nbsp;&nbsp; return [5]
<br>&gt; ...<br>&gt;&gt;&gt;&gt; dir(F())<br>&gt; [5]<br>&gt;&gt;&gt;&gt; f = F()<br>&gt;&gt;&gt;&gt; dir(f)<br>&gt; [5]<br>&gt;&gt;&gt;&gt; def __dir__(): return [10]<br>&gt; ...<br>&gt;&gt;&gt;&gt; f.__dir__ = __dir__<br>
&gt;&gt;&gt;&gt; dir(f)<br>&gt; [5]<br>&gt;<br>&gt; I think the problem is in _dir_object()<br>&gt;<br>&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyObject * dirfunc = PyObject_GetAttrString((PyObject*)obj-&gt;ob_type,<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;__dir__&quot;);
<br>&gt;<br>&gt; Shouldn&#39;t the first arg just be obj, not obj-&gt;ob_type?<br><br>[Georg]<br>This is modeled after the principle that for new-style objects, __special__<br>methods are looked up on the type, not the instance.
<br><br>-----<br><br>1) I didn&#39;t remember this, do we have it documented somewhere?<br>2) Assuming #1 is correct, is this rule consistently applied?<br>3) How does (should) this affect 2.6 and migration to 3.0, if at all?
</blockquote><div><br>I don&#39;t remember seeing it documented, but it&#39;s the biggest (and hardest to detect) incompatibility between classic and new-style classes. It does, however, make sense to me. (The type is what defines behaviour, not the instance.) It seems to be quite consistently applied throughout the interpreter, but not throughout other modules that use their own __hooks__ -- say, pickle. That&#39;s because they (naturally) do &#39;obj.__hook__()&#39;, not &#39;obj.__class__.__hook__(obj)&#39;. We could make this entirely consistent by making all __*__ methods be data descriptors on the class, which takes precedence over instance attributes. (So make them like property() rather than methods like now; you wouldn&#39;t be able to shadow them in an instance&#39;s __dict__.) A decorator would make sense too if we controlled all places the hooks get defined, but we don&#39;t, so it doesn&#39;t.
<br></div><br>As for 2.6-&gt;3.0 migration, it&#39;s all part of classic vs. new-style, but yes, we should warn about this. And yes, we can, although only by somewhat evil magic: make a list of affected __methods__ (unless we&#39;re going to solve it generically like I sketched above, which I doubt), make a special data descriptor on classic instances for each one, have that data descriptor check to see if the instance has a shadowing attribute in __dict__ and if so, warn and use it.
<br><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">n<br>_______________________________________________<br>Python-3000 mailing list<br>
<a href="mailto:Python-3000@python.org">Python-3000@python.org</a><br><a href="http://mail.python.org/mailman/listinfo/python-3000">http://mail.python.org/mailman/listinfo/python-3000</a><br>Unsubscribe: <a href="http://mail.python.org/mailman/options/python-3000/thomas%40python.org">
http://mail.python.org/mailman/options/python-3000/thomas%40python.org</a><br></blockquote></div><br><br clear="all"><br>-- <br>Thomas Wouters &lt;<a href="mailto:thomas@python.org">thomas@python.org</a>&gt;<br><br>Hi! I&#39;m a .signature virus! copy me into your .signature file to help me spread!