--- /Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py.orig 2021-02-03 23:53:51.000000000 +0900 +++ /Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py 2021-02-04 00:01:22.000000000 +0900 @@ -2023,13 +2023,22 @@ invalid = object() module = None - module_dict = {} + globals_list = [] + if isclass(obj): + for base in getmro(obj): + module_name = getattr(base, '__module__', None) + if module_name: + module = sys.modules.get(module_name, None) + if module: + globals_list.append(module.__dict__) + else: module_name = getattr(obj, '__module__', None) if module_name: module = sys.modules.get(module_name, None) if module: - module_dict = module.__dict__ - sys_module_dict = sys.modules.copy() + globals_list.append(module.__dict__) + + globals_list.append(sys.modules.copy()) def parse_name(node): assert isinstance(node, ast.arg) @@ -2038,12 +2047,13 @@ return node.arg def wrap_value(s): + for globalns in globals_list: try: - value = eval(s, module_dict) - except NameError: - try: - value = eval(s, sys_module_dict) + value = eval(s, globalns) + break except NameError: + pass + else: raise RuntimeError() if isinstance(value, (str, int, float, bytes, bool, type(None))):