{"record":{"id":"bdc5112cecdaad65","repo":"python/cpython","slug":"name-name-200-is-not-defined","errorCode":null,"errorMessage":"name '{name:.200}' is not defined","messagePattern":"name '(.+?)' is not defined","errorType":"exception","errorClass":"NameError","httpStatus":null,"severity":"error","filePath":"Lib/annotationlib.py","lineNumber":203,"sourceCode":"                    pass\n                else:\n                    locals.setdefault(cell_name, cell_value)\n\n        if self.__extra_names__:\n            locals.update(self.__extra_names__)\n\n        arg = self.__forward_arg__\n        if arg.isidentifier() and not keyword.iskeyword(arg):\n            if arg in locals:\n                return locals[arg]\n            elif arg in globals:\n                return globals[arg]\n            elif hasattr(builtins, arg):\n                return getattr(builtins, arg)\n            elif is_forwardref_format:\n                return self\n            else:\n                raise NameError(_NAME_ERROR_MSG.format(name=arg), name=arg)\n        else:\n            code = self.__forward_code__\n            try:\n                return eval(code, globals=globals, locals=locals)\n            except Exception:\n                if not is_forwardref_format:\n                    raise\n\n            # All variables, in scoping order, should be checked before\n            # triggering __missing__ to create a _Stringifier.\n            new_locals = _StringifierDict(\n                {**builtins.__dict__, **globals, **locals},\n                globals=globals,\n                owner=owner,\n                is_class=self.__forward_is_class__,\n                format=format,\n            )\n            try:","sourceCodeStart":185,"sourceCodeEnd":221,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/annotationlib.py#L185-L221","documentation":"When ForwardRef.evaluate() resolves a simple identifier, it looks in locals, then globals, then builtins; if the name is found nowhere and the target format is not a forward-ref-preserving format, it raises NameError with the standard message and a `name=` keyword carrying the unresolved identifier. This mirrors normal Python name resolution for annotation strings.","triggerScenarios":"ForwardRef('Missing').evaluate(); typing.get_type_hymes on annotations referencing names deleted/renamed/moved; class-level annotations like 'def f(self) -> Result:' where Result was never imported or was defined after use under `from __future__ import annotations`.","commonSituations":"Refactors that move classes without updating string annotations; TYPE_CHECKING-only imports used at runtime; deserialized/pickled annotation strings evaluated in a fresh namespace lacking the original module globals.","solutions":["Import or define the referenced name so it is resolvable at evaluation time","Pass the defining module's namespace: ForwardRef('X').evaluate(globals=vars(module))","Guard imports used only for annotations under TYPE_CHECKING and evaluate lazily only when needed","Catch NameError and fall back to Format.FORWARDREF/STRING format to defer resolution"],"exampleFix":"# before\nfrom __future__ import annotations\n\ndef parse() -> Result: ...   # NameError: name 'Result' is not defined (on get_type_hints)\n\n# after\nfrom __future__ import annotations\nfrom mymod import Result\n\ndef parse() -> Result: ...","handlingStrategy":"try-catch","validationCode":"def evaluate_ref(fr, module_globals):\n    try:\n        return fr.evaluate(globals=module_globals)\n    except NameError:\n        return None  # defer: unresolved symbol","typeGuard":"def name_resolvable(name: str, globals_ns: dict, locals_ns: dict = None) -> bool:\n    import builtins\n    scopes = [locals_ns or {}, globals_ns, vars(builtins)]\n    return any(name in s for s in scopes)","tryCatchPattern":"from annotationlib import ForwardRef, Format\n\ntry:\n    obj = fr.evaluate(globals=ns)\nexcept NameError as e:\n    if getattr(e, 'name', None) == target_name:\n        obj = fr.evaluate(globals=ns, format=Format.FORWARDREF)  # keep as ForwardRef\n    else:\n        raise","preventionTips":["Evaluate annotations with the defining module's namespace: globals=vars(sys.modules[cls.__module__])","Do not delete or rename annotated names without grepping string annotations","Catch NameError and retry with Format.FORWARDREF to defer resolution","Keep runtime-needed imports outside `if TYPE_CHECKING:` blocks"],"tags":["annotations","typing","forwardref","nameerror","name-resolution","cpython"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}