(self, identifiers, toplevel=False, limit=None)
write variable declarations at the top of a function.

        the variable declarations are in the form of callable
        definitions for defs and/or name lookup within the
        function's context argument. the names declared are based
        on the names that are referenced in the function body,
        which don't otherwise have any explicit assignment
        operation. names that are assigned within the body are
        assumed to be locally-scoped variables and are not
        separately declared.

        for def callable definitions, if the def is a top-level
        callable then a 'stub' callable is generated which wraps
        the current Context into a closure. if the def is not
        top-level, it is fully rendered as a local closure.
write variable declarations at the top of a function.
write variable declarations at the top of a function .
def write_variable_declares(self, identifiers, toplevel=False, limit=None):
        """write variable declarations at the top of a function.

        the variable declarations are in the form of callable
        definitions for defs and/or name lookup within the
        function's context argument. the names declared are based
        on the names that are referenced in the function body,
        which don't otherwise have any explicit assignment
        operation. names that are assigned within the body are
        assumed to be locally-scoped variables and are not
        separately declared.

        for def callable definitions, if the def is a top-level
        callable then a 'stub' callable is generated which wraps
        the current Context into a closure. if the def is not
        top-level, it is fully rendered as a local closure.

        """

        # collection of all defs available to us in this scope
        comp_idents = dict([(c.funcname, c) for c in identifiers.defs])
        to_write = set()

        # write "context.get()" for all variables we are going to
        # need that arent in the namespace yet
        to_write = to_write.union(identifiers.undeclared)

        # write closure functions for closures that we define
        # right here
        to_write = to_write.union(
            [c.funcname for c in identifiers.closuredefs.values()]
        )

        # remove identifiers that are declared in the argument
        # signature of the callable
        to_write = to_write.difference(identifiers.argument_declared)

        # remove identifiers that we are going to assign to.
        # in this way we mimic Python's behavior,
        # i.e. assignment to a variable within a block
        # means that variable is now a "locally declared" var,
        # which cannot be referenced beforehand.
        to_write = to_write.difference(identifiers.locally_declared)

        if self.compiler.enable_loop:
            has_loop = "loop" in to_write
            to_write.discard("loop")
        else:
            has_loop = False

        # if a limiting set was sent, constraint to those items in that list
        # (this is used for the caching decorator)
        if limit is not None:
            to_write = to_write.intersection(limit)

        if toplevel and getattr(self.compiler, "has_ns_imports", False):
            self.printer.writeline("_import_ns = {}")
            self.compiler.has_imports = True
            for ident, ns in self.compiler.namespaces.items():
                if "import" in ns.attributes:
                    self.printer.writeline(
                        "_mako_get_namespace(context, %r)."
                        "_populate(_import_ns, %r)"
                        % (
                            ident,
                            re.split(r"\s*,\s*", ns.attributes["import"]),
                        )
                    )

        if has_loop:
            self.printer.writeline("loop = __M_loop = runtime.LoopStack()")

        for ident in to_write:
            if ident in comp_idents:
                comp = comp_idents[ident]
                if comp.is_block:
                    if not comp.is_anonymous:
                        self.write_def_decl(comp, identifiers)
                    else:
                        self.write_inline_def(comp, identifiers, nested=True)
                else:
                    if comp.is_root():
                        self.write_def_decl(comp, identifiers)
                    else:
                        self.write_inline_def(comp, identifiers, nested=True)

            elif ident in self.compiler.namespaces:
                self.printer.writeline(
                    "%s = _mako_get_namespace(context, %r)" % (ident, ident)
                )
            else:
                if getattr(self.compiler, "has_ns_imports", False):
                    if self.compiler.strict_undefined:
                        self.printer.writelines(
                            "%s = _import_ns.get(%r, UNDEFINED)"
                            % (ident, ident),
                            "if %s is UNDEFINED:" % ident,
                            "try:",
                            "%s = context[%r]" % (ident, ident),
                            "except KeyError:",
                            "raise NameError(\"'%s' is not defined\")" % ident,
                            None,
                            None,
                        )
                    else:
                        self.printer.writeline(
                            "%s = _import_ns.get"
                            "(%r, context.get(%r, UNDEFINED))"
                            % (ident, ident, ident)
                        )
                else:
                    if self.compiler.strict_undefined:
                        self.printer.writelines(
                            "try:",
                            "%s = context[%r]" % (ident, ident),
                            "except KeyError:",
                            "raise NameError(\"'%s' is not defined\")" % ident,
                            None,
                        )
                    else:
                        self.printer.writeline(
                            "%s = context.get(%r, UNDEFINED)" % (ident, ident)
                        )

        self.printer.writeline("__M_writer = context.writer()")
def write_variable_declares ( self , identifiers , toplevel = False , limit = None ) : # collection of all defs available to us in this scope comp_idents = dict ( [ ( c . funcname , c ) for c in identifiers . defs ] ) to_write = set ( ) # write "context.get()" for all variables we are going to # need that arent in the namespace yet to_write = to_write . union ( identifiers . undeclared ) # write closure functions for closures that we define # right here to_write = to_write . union ( [ c . funcname for c in identifiers . closuredefs . values ( ) ] ) # remove identifiers that are declared in the argument # signature of the callable to_write = to_write . difference ( identifiers . argument_declared ) # remove identifiers that we are going to assign to. # in this way we mimic Python's behavior, # i.e. assignment to a variable within a block # means that variable is now a "locally declared" var, # which cannot be referenced beforehand. to_write = to_write . difference ( identifiers . locally_declared ) if self . compiler . enable_loop : has_loop = "loop" in to_write to_write . discard ( "loop" ) else : has_loop = False # if a limiting set was sent, constraint to those items in that list # (this is used for the caching decorator) if limit is not None : to_write = to_write . intersection ( limit ) if toplevel and getattr ( self . compiler , "has_ns_imports" , False ) : self . printer . writeline ( "_import_ns = {}" ) self . compiler . has_imports = True for ident , ns in self . compiler . namespaces . items ( ) : if "import" in ns . attributes : self . printer . writeline ( "_mako_get_namespace(context, %r)." "_populate(_import_ns, %r)" % ( ident , re . split ( r"\s*,\s*" , ns . attributes [ "import" ] ) , ) ) if has_loop : self . printer . writeline ( "loop = __M_loop = runtime.LoopStack()" ) for ident in to_write : if ident in comp_idents : comp = comp_idents [ ident ] if comp . is_block : if not comp . is_anonymous : self . write_def_decl ( comp , identifiers ) else : self . write_inline_def ( comp , identifiers , nested = True ) else : if comp . is_root ( ) : self . write_def_decl ( comp , identifiers ) else : self . write_inline_def ( comp , identifiers , nested = True ) elif ident in self . compiler . namespaces : self . printer . writeline ( "%s = _mako_get_namespace(context, %r)" % ( ident , ident ) ) else : if getattr ( self . compiler , "has_ns_imports" , False ) : if self . compiler . strict_undefined : self . printer . writelines ( "%s = _import_ns.get(%r, UNDEFINED)" % ( ident , ident ) , "if %s is UNDEFINED:" % ident , "try:" , "%s = context[%r]" % ( ident , ident ) , "except KeyError:" , "raise NameError(\"'%s' is not defined\")" % ident , None , None , ) else : self . printer . writeline ( "%s = _import_ns.get" "(%r, context.get(%r, UNDEFINED))" % ( ident , ident , ident ) ) else : if self . compiler . strict_undefined : self . printer . writelines ( "try:" , "%s = context[%r]" % ( ident , ident ) , "except KeyError:" , "raise NameError(\"'%s' is not defined\")" % ident , None , ) else : self . printer . writeline ( "%s = context.get(%r, UNDEFINED)" % ( ident , ident ) ) self . printer . writeline ( "__M_writer = context.writer()" )