This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients Asdger Gdsfe, Dave Jones, eryksun, hakril, ncoghlan, serhiy.storchaka, vstinner
Date 2022-03-28.22:12:40
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1648505560.51.0.929001326746.issue29270@roundup.psfhosted.org>
In-reply-to
Content
CreateSwappedType() is an helper function used by the _ctypes.PyCSimpleType type. Python script reproducing this ctypes bug:
---
class PyCSimpleType(type):
    def __new__(cls, name, bases, dct):
        print(f"PyCSimpleType: create {name} class")
        cell = dct.get('__classcell__', None)
        # type.__new__() sets __classcell__
        x = super().__new__(cls, name, bases, dct)
        if cell is not None:
            print(f"PyCSimpleType: after first type.__new__() call: __classcell__={cell.cell_contents}")

        name2 = name + "_Swapped"
        dct2 = dict(dct, __qualname__=name2)
        # Calling type.__new__() again with the same cell object overrides
        # __classcell__
        x.__ctype_be__ = super().__new__(cls, name2, bases, dct2)
        if cell is not None:
            print(f"PyCSimpleType: after second type.__new__() call: __classcell__={cell.cell_contents}")

        return x

class BaseItem:
    pass

class Item(BaseItem, metaclass=PyCSimpleType):
    def get_class(self):
        # get '__class__' to create a closure
        return __class__

    # Alternative to create a closure:
    #def __repr__(self):
    #    return super().__repr__()
---

Output:
---
PyCSimpleType: create Item class
PyCSimpleType: after first type.__new__() call: __classcell__=<class '__main__.Item'>
PyCSimpleType: after second type.__new__() call: __classcell__=<class '__main__.Item_Swapped'>
Traceback (most recent call last):
  File "meta.py", line 23, in <module>
    class Item(BaseItem, metaclass=PyCSimpleType):
TypeError: __class__ set to <class '__main__.Item_Swapped'> defining 'Item' as <class '__main__.Item'>
---

It's not a bug in Python types, but a bug specific to the _ctypes.PyCSimpleType type which prevents creating subclasses which use closures ("__class__", "super()", etc.).
History
Date User Action Args
2022-03-28 22:12:40vstinnersetrecipients: + vstinner, ncoghlan, serhiy.storchaka, eryksun, hakril, Dave Jones, Asdger Gdsfe
2022-03-28 22:12:40vstinnersetmessageid: <1648505560.51.0.929001326746.issue29270@roundup.psfhosted.org>
2022-03-28 22:12:40vstinnerlinkissue29270 messages
2022-03-28 22:12:40vstinnercreate