Best practice for lazy loading Python modules

后端 未结 4 1370
孤城傲影
孤城傲影 2021-02-03 19:09

Occasionally I want lazy module loading in Python. Usually because I want to keep runtime requirements or start-up times low and splitting the code into sub-modules would be cum

相关标签:
4条回答
  • 2021-02-03 19:36

    The other answers have covered the actual details but if you are interested in a lazy loading library, check out apipkg which is part of the py package (py.test fame).

    0 讨论(0)
  • 2021-02-03 19:46

    There's no reason for you to keep track of imports manually -- the VM maintains a list of modules that have already been imported, and any subsequent attempts to import that module result in a quick dict lookup in sys.modules and nothing else.

    The difference between your code and

    def render_with_jinja2(self, values, template_name):
        import jinja2
        env = jinja2.Environment(...)
    

    is zero -- when we hit that code, if jinja2 hasn't been imported, it is imported then. If it already has been, execution continues on.

    0 讨论(0)
  • 2021-02-03 19:50

    Nice pattern from sqlalchemy: dependency injection:

    @util.dependencies("sqlalchemy.orm.query")
    def merge_result(query, *args):
        #...
        query.Query(...)
    

    Instead of declaring all "import" statements at the top of the module, it will only import a module when it's actually needed by a function. This can resolve circular dependency problems.

    0 讨论(0)
  • 2021-02-03 19:54
    class Handler(...):
        ...
        def render_with_jinja2(self, values, template_name):
            import jinja2
            env = jinja2.Environment(...)
            ...
    

    There's no need to cache the imported module; Python does that already.

    0 讨论(0)
提交回复
热议问题