Enter a function, generator or comprehension scope.
(
self, function: FuncItem | GeneratorExpr | DictionaryComprehension
)
| 7407 | |
| 7408 | @contextmanager |
| 7409 | def enter( |
| 7410 | self, function: FuncItem | GeneratorExpr | DictionaryComprehension |
| 7411 | ) -> Iterator[None]: |
| 7412 | """Enter a function, generator or comprehension scope.""" |
| 7413 | names = self.saved_locals.setdefault(function, SymbolTable()) |
| 7414 | self.locals.append(names) |
| 7415 | is_comprehension = isinstance(function, (GeneratorExpr, DictionaryComprehension)) |
| 7416 | self.scope_stack.append(SCOPE_FUNC if not is_comprehension else SCOPE_COMPREHENSION) |
| 7417 | self.global_decls.append(set()) |
| 7418 | self.nonlocal_decls.append(set()) |
| 7419 | # -1 since entering block will increment this to 0. |
| 7420 | self.block_depth.append(-1) |
| 7421 | self.loop_depth.append(0) |
| 7422 | self.missing_names.append(set()) |
| 7423 | try: |
| 7424 | yield |
| 7425 | finally: |
| 7426 | self.locals.pop() |
| 7427 | self.scope_stack.pop() |
| 7428 | self.global_decls.pop() |
| 7429 | self.nonlocal_decls.pop() |
| 7430 | self.block_depth.pop() |
| 7431 | self.loop_depth.pop() |
| 7432 | self.missing_names.pop() |
| 7433 | |
| 7434 | def is_func_scope(self) -> bool: |
| 7435 | scope_type = self.scope_stack[-1] |
no test coverage detected