前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python导入循环方法

Python导入循环方法

作者头像
py3study
发布2020-01-06 16:52:28
5880
发布2020-01-06 16:52:28
举报
文章被收录于专栏:python3python3python3

摘自:Python核心编程第二版:

12.8.5 导入循环

    实际上,在使用 Python 时, 你会发现是能够导入循环的。 如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。 

    我们来看一个例子。 假定我们的产品有一个很复杂的命令行接口( command-line interface ,CLI)。 其中将会有超过一百万的命令, 结果你就有了一个“超冗余处理器”(overly massive handler,OMH)子集。 每加入一个新特性, 将有一到三条的新命令加入, 用于支持新的特性。 下边是我们的omh4cli.py 脚本:

from cli4vof import cli4vof

# command line interface utility function

def cli_util():

    pass

# overly massive handlers for the command line interface

def omh4cli():

    :

        cli4vof()

    :

        omh4cli()

    假定大多控制器都要用到这里的(其实是空的)工具函数。命令行接口的 OMH 都被封装在 omh4cli() 函数里。 如果我们要添加一个新的命令, 那么它会被调用。 

    现在这个模块不断地增长, 一些聪明的工程师会决定把新命令放入到隔离的模块里, 在原始模 块中只提供访问新东西的钩子。 这样, 管理代码会变得更简单, 如果在新加入内容中发现了 bug , 那么你就不必在一个几兆的 Python 文件里搜索。 

    在我们的例子中, 有一个兴奋的经理要我们加入一个 "非常好的特性"。我们将创建一个新的 cli4vof.py 脚本, 而不是把新内容集成到omh4cli.py 里: 

import omh4cli 

# command-line interface for a very outstanding feature

def cli4vof():

    omh4cli.cli_util()

    前边已经提到, 工具函数是每个命令必须的, 而且由于不能把代码从主控制器复制出来, 所以 我们导入了主模块, 在我们的控制器中添加对 omh , omh4cli() 的调用。 

    问题在于主控制器 omh4cli 会导入我们的 cli4vof 模块(获得新命令的函数), 而 cli4vof 也会导入 omh4cli (用于获得工具函数)。模块导入会失败, 这是因为 Python 尝试导入一个先前没 有完全导入的模块:

$ python omh4cli.py 

Traceback (most recent call last):

File "omh4cli.py", line 3, in ? from cli4vof import cli4vof

File "/usr/prod/cli4vof.py", line 3, in ?

import omh4cli

File "/usr/prod/omh4cli.py", line 3, in ?

from cli4vof import cli4vof

ImportError: cannot import name cli4vof

    注意跟踪返回消息中显示的对 cli4vof 的循环导入。 问题在于要想调用工具函数, cli4vof 必 须导入 omh4cli 。 如果它不需要这样做, 那么 omh4cli 将会成功导入 cli4vof , 程序正常执行。 但在这里, omh4cli 尝试导入 cli4vof , 而 cli4vof 也试着导入 omh4cli 。 最后谁也不会完成 导入工作, 引发错误。 这只是一个导入循环的例子。 事实上实际应用中会出现更复杂的情况。

    解决这个问题几乎总是移除其中一个导入语句。 你经常会在模块的最后看到 import 语句。作 为一个初学者, 你只需要试着习惯它们, 如果你以前遇到在模块底部的 import 语句,现在你知道是为什么了。在我们的例子中, 我们不能把 import omh4cli 移到最后, 因为调用 cli4vof() 的时候 omh4cli() 名字还没有被载入。

$ python omh4cli.py 

Traceback (most recent call last): File "omh4cli.py", line 3, in ? from cli4vof import

cli4vof

File "/usr/prod/cli4vof.py", line 7, in ?

import omh4cli

File "/usr/prod/omh4cli.py", line 13, in ?

omh4cli()

File "/usr/prod/omh4cli.py", line 11, in omh4cli cli4vof()

File "/usr/prod/cli4vof.py", line 5, in cli4vof omh4cli.cli_util()

NameError: global name 'omh4cli' is not defined

    我们的解决方法只是把 import 语句移到 cli4vof() 函数内部:

def cli4vof():

    import omh4cli

    omh4cli.cli_util()

    这样, 从 omh4cli() 导入 cli4vof() 模块会顺利完成, 在 omh4cli() 被调用之前它会被正 确导入。 只有在执行到 cli4vof.cli4vof() 时候才会导入 omh4cli 模块。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档