src/basilisp/lang/compiler/generator.py
def _import_to_py_ast(ctx: GeneratorContext, node: Import) -> GeneratedPyAST:
    """Return a Python AST node for a Basilisp `import*` expression."""
    assert node.op == NodeOp.IMPORT

    last = None
    deps: List[ast.AST] = []
    for alias in node.aliases:
        safe_name = munge(alias.name)

        try:
            module = importlib.import_module(safe_name)
            if alias.alias is not None:
                ctx.add_import(sym.symbol(alias.name), module, sym.symbol(alias.alias))
            else:
                ctx.add_import(sym.symbol(alias.name), module)
        except ModuleNotFoundError as e:
            raise ImportError(
                f"Python module '{alias.name}' not found", node.form, node
            ) from e

        py_import_alias = (
            munge(alias.alias)
            if alias.alias is not None
            else safe_name.split(".", maxsplit=1)[0]
        )
        deps.append(
            ast.Assign(
                targets=[ast.Name(id=py_import_alias, ctx=ast.Store())],
                value=ast.Call(
                    func=_load_attr("builtins.__import__"),
                    args=[ast.Str(safe_name)],
                    keywords=[],
                ),
            )
        )
        last = ast.Name(id=py_import_alias, ctx=ast.Load())

        # Note that we add this import to the live running system in the above
        # calls to `ctx.add_import`, however, since we compile and cache Python
        # bytecode, we need to generate calls to `add_import` for the running
        # namespace so when this code is reloaded from the cache, the runtime
        # is correctly configured.
        deps.append(
            ast.Call(
                func=_load_attr(f"{_NS_VAR_VALUE}.add_import"),
                args=[
                    ast.Call(
                        func=_NEW_SYM_FN_NAME, args=[ast.Str(safe_name)], keywords=[]
                    ),
                    last,
                ],
                keywords=[],
            )
        )

    assert last is not None, "import* node must have at least one import"
    return GeneratedPyAST(node=last, dependencies=deps)
def _import_to_py_ast(ctx: GeneratorContext, node: Import) -> GeneratedPyAST:
    """Return a Python AST node for a Basilisp `import*` expression."""
    assert node.op == NodeOp.IMPORT

    last = None
    deps: List[ast.AST] = []
    for alias in node.aliases:
        safe_name = munge(alias.name)

        try:
            module = importlib.import_module(safe_name)
            if alias.alias is not None:
                ctx.add_import(sym.symbol(alias.name), module, sym.symbol(alias.alias))
            else:
                ctx.add_import(sym.symbol(alias.name), module)
        except ModuleNotFoundError as e:
            raise ImportError(
                f"Python module '{alias.name}' not found", node.form, node
            ) from e

        py_import_alias = (
            munge(alias.alias)
            if alias.alias is not None
            else safe_name.split(".", maxsplit=1)[0]
        )
        deps.append(
            ast.Assign(
                targets=[ast.Name(id=py_import_alias, ctx=ast.Store())],
                value=ast.Call(
                    func=_load_attr("builtins.__import__"),
                    args=[ast.Str(safe_name)],
                    keywords=[],
                ),
            )
        )
        last = ast.Name(id=py_import_alias, ctx=ast.Load())

        # Note that we add this import to the live running system in the above
        # calls to `ctx.add_import`, however, since we compile and cache Python
        # bytecode, we need to generate calls to `add_import` for the running
        # namespace so when this code is reloaded from the cache, the runtime
        # is correctly configured.
        deps.append(
            ast.Call(
                func=_load_attr(f"{_NS_VAR_VALUE}.add_import"),
                args=[
                    ast.Call(
                        func=_NEW_SYM_FN_NAME, args=[ast.Str(safe_name)], keywords=[]
                    ),
                    last,
                ],
                keywords=[],
            )
        )

    assert last is not None, "import* node must have at least one import"
    return GeneratedPyAST(node=last, dependencies=deps)
def _import_to_py_ast ( ctx : GeneratorContext , node : Import ) -> GeneratedPyAST : assert node . op == NodeOp . IMPORT last = None deps : List [ ast . AST ] = [ ] for alias in node . aliases : safe_name = munge ( alias . name ) try : module = importlib . import_module ( safe_name ) if alias . alias is not None : ctx . add_import ( sym . symbol ( alias . name ) , module , sym . symbol ( alias . alias ) ) else : ctx . add_import ( sym . symbol ( alias . name ) , module ) except ModuleNotFoundError as e : raise ImportError ( f"Python module '{alias.name}' not found" , node . form , node ) from e py_import_alias = ( munge ( alias . alias ) if alias . alias is not None else safe_name . split ( "." , maxsplit = 1 ) [ 0 ] ) deps . append ( ast . Assign ( targets = [ ast . Name ( id = py_import_alias , ctx = ast . Store ( ) ) ] , value = ast . Call ( func = _load_attr ( "builtins.__import__" ) , args = [ ast . Str ( safe_name ) ] , keywords = [ ] , ) , ) ) last = ast . Name ( id = py_import_alias , ctx = ast . Load ( ) ) # Note that we add this import to the live running system in the above # calls to `ctx.add_import`, however, since we compile and cache Python # bytecode, we need to generate calls to `add_import` for the running # namespace so when this code is reloaded from the cache, the runtime # is correctly configured. deps . append ( ast . Call ( func = _load_attr ( f"{_NS_VAR_VALUE}.add_import" ) , args = [ ast . Call ( func = _NEW_SYM_FN_NAME , args = [ ast . Str ( safe_name ) ] , keywords = [ ] ) , last , ] , keywords = [ ] , ) ) assert last is not None , "import* node must have at least one import" return GeneratedPyAST ( node = last , dependencies = deps )
Return a Python AST node for a Basilisp `import*` expression.
Return a Python AST node for a Basilisp import * expression .