ironpython2 icon indicating copy to clipboard operation
ironpython2 copied to clipboard

IronPython handles descriptor replacement differently than CPython

Open mickp opened this issue 1 year ago • 2 comments

If a type is patched with a descriptor, referencing the name on the type (rather than an instance) hits the descriptor's getter/setter, where it does not in CPython.

class SomeDescriptor(object):
    def __get__(self, obj, obj_type=None):
        print('__get__', self, obj, obj_type)
        return self

    def __set__(self, obj, value):
        print('__set__', self, obj, value)
        return self


class Thing(object):
    @property
    def value(self):
        return 123


original_property = Thing.value
Thing.value = SomeDescriptor()
Thing.value = original_property
print(Thing().value)

CPython gives:

123

while IronPython gives

('__set__', <SomeDescriptor object at 0x000000000000006C>, None, <property object at 0x000000000000006D>)
('__get__', <SomeDescriptor object at 0x000000000000006C>, <Thing object at 0x000000000000006E>, <class '__main__.Thing'>)
<SomeDescriptor object at 0x000000000000006C>

Version info: IronPython 2.7.12 (2.7.12.1000) [.NETFramework,Version=v4.5 on .NET Framework 4.8.9232.0 (64-bit)]

Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:25:05) [MSC v.1500 64 bit (AMD64)] on win32

mickp avatar Jan 22 '25 22:01 mickp

For reference, this is fixed in ipy3. Maybe by https://github.com/IronLanguages/ironpython3/pull/1272?

slozier avatar Jan 22 '25 23:01 slozier

Thanks. I'm working around it python-side for now. However, this prompted me to take another look at getting the project updated to use IronPython 3, but I hit some fundamental issues I don't understand. I started a new discussion over in the 3 repo: https://github.com/IronLanguages/ironpython3/discussions/1881

mickp avatar Jan 24 '25 08:01 mickp