-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
isinstance(constantdict(), dict)
returns True
#35
Comments
Sample error from loopy (via inducer/loopy#884):
|
An approach similar to https://github.com/inducer/arraycontext/blob/029026cca4655be0314751cb2a2abfc26bc3732b/arraycontext/container/arithmetic.py#L126-L132 may not work: >>> class CDMetaClass(type):
... def __instancecheck__(cls, instance) -> bool:
... print(" -- instancecheck", cls, instance, cls == type(instance))
... return cls == type(instance)
...
>>> class constantdict(dict, metaclass=CDMetaClass):
... pass
...
>>> obj1 = constantdict({1:2})
>>>
>>> print(isinstance(obj1, dict))
True # should be False, but __instancecheck__ isn't even called
>>> print(isinstance(obj1, constantdict))
True # correct result, but __instancecheck__ was also not called cc @inducer |
Ugh, interesting. The root base class sets the metaclass. Recreating a custom dict with the desired metaclass also doesn't work: class CDMetaClass(type):
def __instancecheck__(cls, instance) -> bool:
print(" -- instancecheck", cls, instance, cls is type(instance))
return cls is type(instance)
basedict = CDMetaClass('basedict', dict.__bases__, dict(vars(dict)))
class constantdict(basedict):
pass
obj1 = constantdict({"a": 1, "b": 2})
print(isinstance(obj1, dict))
print(isinstance(obj1, constantdict)) Multiple inheritance also can't change metaclasses: class CDMetaClass(type):
def __instancecheck__(cls, instance) -> bool:
print(" -- instancecheck", cls, instance, cls is type(instance))
return cls is type(instance)
class MetaBase(metaclass=CDMetaClass):
pass
class constantdict(dict, MetaBase):
pass
class constantdict2(MetaBase, dict): # also nope
pass
obj1 = constantdict({"a": 1, "b": 2})
print(isinstance(obj1, dict))
print(isinstance(obj1, constantdict)) |
Same for:
isinstance(constantdict(), MutableMapping)
issubclass(constantdict, dict)
issubclass(constantdict, MutableMapping)
https://stackoverflow.com/questions/57982946/how-to-register-implementation-of-abc-mutablemapping-as-a-dict-subclass
The text was updated successfully, but these errors were encountered: