On Apr 11, 2008, at 4:58 PM, Lisandro Dalcin wrote:

> It seems the code generated by
>
> cdef MyClass cval = MyClass()
>
> a = b = cval
>
> is not equivalent in semantics to Python, 'a is b' should be true.

Actually it follows Python semantics exactly. It does not follow C  
semantics (which treats b = cval as an expression). There are many  
fewer cases in Python where code is executed on assignment, but  
unpacking is one of them. Here is a demonstration:

class Unpackable:
     def __iter__(self):
         try:
             self.n += 1
             print "unpacking", self.n
             return iter([self.n])
         except AttributeError:
             self.n = 0
             return iter(self)

(a,) = (b,) = (c,) = Unpackable(); print a, b, c

unpacking 1
unpacking 2
unpacking 3
1 2 3

> I acctually did this
>
> cdef int cval = 10
> a = b = cval
>
> then 'a is b'  is true, because of the internal Python cache for  
> small integers.

Yep.

I am grateful for your attention to details, I am sure it will help  
make Cython better.

- Robert


_______________________________________________
Cython-dev mailing list
Cython-dev@codespeak.net
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to