When tested with isinstance() against an ABC, LocalProxy instances raise an exception rather than returning False.
import abc
from werkzeug import local
ls=local.LocalStack()
x=ls()
class C(abc.ABC):
pass
isinstance(x, C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.9/abc.py", line 119, in __instancecheck__
return _abc_instancecheck(cls, instance)
File "/usr/lib/python3.9/abc.py", line 123, in __subclasscheck__
return _abc_subclasscheck(cls, subclass)
TypeError: issubclass() arg 1 must be a class
The call to isinstance() should have returned False rather than an exception.
It seems to be related to the fact that x.__class__ is not a class as expected, but an unbound method. Calling it with x.__class__() returns the expected werkzeug.local.LocalProxy class. While it's not documented in Python except for builtin types, most of the ecosystem will assume type(x) is x.__class__, including it appears the standard library.
Environment:
- Python version: Python 3.9.6
- Werkzeug version: 2.0.1
When tested with isinstance() against an ABC, LocalProxy instances raise an exception rather than returning False.
The call to isinstance() should have returned False rather than an exception.
It seems to be related to the fact that
x.__class__is not a class as expected, but an unbound method. Calling it withx.__class__()returns the expectedwerkzeug.local.LocalProxyclass. While it's not documented in Python except for builtin types, most of the ecosystem will assumetype(x) is x.__class__, including it appears the standard library.Environment: