Visit named imports.
(self, node: nodes.FromImport, frame: Frame)
| 1105 | self.writeline(f"context.exported_vars.discard({node.target!r})") |
| 1106 | |
| 1107 | def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: |
| 1108 | """Visit named imports.""" |
| 1109 | self.newline(node) |
| 1110 | self.write("included_template = ") |
| 1111 | self._import_common(node, frame) |
| 1112 | var_names = [] |
| 1113 | discarded_names = [] |
| 1114 | for name in node.names: |
| 1115 | if isinstance(name, tuple): |
| 1116 | name, alias = name |
| 1117 | else: |
| 1118 | alias = name |
| 1119 | self.writeline( |
| 1120 | f"{frame.symbols.ref(alias)} =" |
| 1121 | f" getattr(included_template, {name!r}, missing)" |
| 1122 | ) |
| 1123 | self.writeline(f"if {frame.symbols.ref(alias)} is missing:") |
| 1124 | self.indent() |
| 1125 | message = ( |
| 1126 | "the template {included_template.__name__!r}" |
| 1127 | f" (imported on {self.position(node)})" |
| 1128 | f" does not export the requested name {name!r}" |
| 1129 | ) |
| 1130 | self.writeline( |
| 1131 | f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" |
| 1132 | ) |
| 1133 | self.outdent() |
| 1134 | if frame.toplevel: |
| 1135 | var_names.append(alias) |
| 1136 | if not alias.startswith("_"): |
| 1137 | discarded_names.append(alias) |
| 1138 | |
| 1139 | if var_names: |
| 1140 | if len(var_names) == 1: |
| 1141 | name = var_names[0] |
| 1142 | self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") |
| 1143 | else: |
| 1144 | names_kv = ", ".join( |
| 1145 | f"{name!r}: {frame.symbols.ref(name)}" for name in var_names |
| 1146 | ) |
| 1147 | self.writeline(f"context.vars.update({{{names_kv}}})") |
| 1148 | if discarded_names: |
| 1149 | if len(discarded_names) == 1: |
| 1150 | self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") |
| 1151 | else: |
| 1152 | names_str = ", ".join(map(repr, discarded_names)) |
| 1153 | self.writeline( |
| 1154 | f"context.exported_vars.difference_update(({names_str}))" |
| 1155 | ) |
| 1156 | |
| 1157 | def visit_For(self, node: nodes.For, frame: Frame) -> None: |
| 1158 | loop_frame = frame.inner() |