11import dataclasses
2+ import inspect
23import logging
34import os
45import sys
@@ -104,6 +105,9 @@ class Callee:
104105def _unkown_module_fixup (func ):
105106 # TODO: Doesn't work for everything (for example: `OrderedDict.fromkeys`, `object.__new__`)
106107
108+ # TODO: Can make this logic easier by using `func.__self__`. For `f = dict().get`, `f.__self__.__class__ == dict`
109+ # and `dict.__new__.__self__ = dict`
110+
107111 module = func .__module__
108112 qualname = func .__qualname__
109113 cls_name , method_name = qualname .split ("." )
@@ -114,12 +118,20 @@ def _unkown_module_fixup(func):
114118
115119 matching_classes = list ()
116120 for klass in object .__subclasses__ ():
117- # type(dict.get) == METHOD_DESCRIPTOR_TYPE
118- # type(dict.__new__) == BUILTIN_FUNCTION_OR_METHOD
119- if klass .__qualname__ == cls_name and type (
120- getattr (klass , method_name , None )
121- ) in [BUILTIN_FUNCTION_OR_METHOD , METHOD_DESCRIPTOR_TYPE ]:
122- matching_classes .append (klass )
121+
122+ if inspect .isabstract (klass ):
123+ continue
124+
125+ try :
126+ # type(dict.get) == METHOD_DESCRIPTOR_TYPE
127+ # type(dict.__new__) == BUILTIN_FUNCTION_OR_METHOD
128+ if klass .__qualname__ == cls_name and type (
129+ getattr (klass , method_name , None )
130+ ) in [BUILTIN_FUNCTION_OR_METHOD , METHOD_DESCRIPTOR_TYPE ]:
131+ matching_classes .append (klass )
132+ # For flask, observed to give `ValueError: Namespace class is abstract`, even with the isabstract above
133+ except ValueError :
134+ pass
123135
124136 if len (matching_classes ) == 1 :
125137 klass = matching_classes [0 ]
0 commit comments