Message416219
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.). |
|
Date |
User |
Action |
Args |
2022-03-28 22:12:40 | vstinner | set | recipients:
+ vstinner, ncoghlan, serhiy.storchaka, eryksun, hakril, Dave Jones, Asdger Gdsfe |
2022-03-28 22:12:40 | vstinner | set | messageid: <1648505560.51.0.929001326746.issue29270@roundup.psfhosted.org> |
2022-03-28 22:12:40 | vstinner | link | issue29270 messages |
2022-03-28 22:12:40 | vstinner | create | |
|