Visit named imports.
(self, node, frame)
| 963 | self.writeline('context.exported_vars.discard(%r)' % node.target) |
| 964 | |
| 965 | def visit_FromImport(self, node, frame): |
| 966 | """Visit named imports.""" |
| 967 | self.newline(node) |
| 968 | self.write('included_template = %senvironment.get_template(' |
| 969 | % (self.environment.is_async and 'await ' or '')) |
| 970 | self.visit(node.template, frame) |
| 971 | self.write(', %r).' % self.name) |
| 972 | if node.with_context: |
| 973 | self.write('make_module%s(context.get_all(), True, %s)' |
| 974 | % (self.environment.is_async and '_async' or '', |
| 975 | self.dump_local_context(frame))) |
| 976 | elif self.environment.is_async: |
| 977 | self.write('_get_default_module_async()') |
| 978 | else: |
| 979 | self.write('_get_default_module()') |
| 980 | |
| 981 | var_names = [] |
| 982 | discarded_names = [] |
| 983 | for name in node.names: |
| 984 | if isinstance(name, tuple): |
| 985 | name, alias = name |
| 986 | else: |
| 987 | alias = name |
| 988 | self.writeline('%s = getattr(included_template, ' |
| 989 | '%r, missing)' % (frame.symbols.ref(alias), name)) |
| 990 | self.writeline('if %s is missing:' % frame.symbols.ref(alias)) |
| 991 | self.indent() |
| 992 | self.writeline('%s = undefined(%r %% ' |
| 993 | 'included_template.__name__, ' |
| 994 | 'name=%r)' % |
| 995 | (frame.symbols.ref(alias), |
| 996 | 'the template %%r (imported on %s) does ' |
| 997 | 'not export the requested name %s' % ( |
| 998 | self.position(node), |
| 999 | repr(name) |
| 1000 | ), name)) |
| 1001 | self.outdent() |
| 1002 | if frame.toplevel: |
| 1003 | var_names.append(alias) |
| 1004 | if not alias.startswith('_'): |
| 1005 | discarded_names.append(alias) |
| 1006 | |
| 1007 | if var_names: |
| 1008 | if len(var_names) == 1: |
| 1009 | name = var_names[0] |
| 1010 | self.writeline('context.vars[%r] = %s' % |
| 1011 | (name, frame.symbols.ref(name))) |
| 1012 | else: |
| 1013 | self.writeline('context.vars.update({%s})' % ', '.join( |
| 1014 | '%r: %s' % (name, frame.symbols.ref(name)) for name in var_names |
| 1015 | )) |
| 1016 | if discarded_names: |
| 1017 | if len(discarded_names) == 1: |
| 1018 | self.writeline('context.exported_vars.discard(%r)' % |
| 1019 | discarded_names[0]) |
| 1020 | else: |
| 1021 | self.writeline('context.exported_vars.difference_' |
| 1022 | 'update((%s))' % ', '.join(imap(repr, discarded_names))) |