【问题标题】:Limiting scope of Python import限制 Python 导入的范围
【发布时间】:2012-04-28 04:00:24
【问题描述】:

我有一些看起来像这样的代码:

from pyparsing import Word, alphas, Optional, ...
# Do stuff ...
# And at the end, save a result to the outside world.
parser = ...

# Now use parser but don't use anything else from pyparsing again.

我喜欢方便地调用from <package> import <etc>,但我只希望它用于非常小的代码段。恐怕我会造成命名空间污染,因为我在同一个文件中有许多这样的小型 sn-ps。

处理这种情况的 Pythonic 方式是什么?我仍然只是在玩弄它,所以我宁愿不写和重写pyparsing.这么多次。

【问题讨论】:

    标签: python namespaces


    【解决方案1】:

    控制命名空间污染的常用方法是

    1. 使用后删除变量
    2. 使用 __all__ 变量
    3. 使用 import-as 来强调变量名

    这些技术都被标准库中的核心开发人员使用。例如 decimal 模块:

    综合起来,这些技术可以让命名空间保持整洁。

    【讨论】:

      【解决方案2】:

      一种简单的方法是使用函数范围来控制文件中的导入可见性:

      def prepare_parser():
          from pyparsing import Word, alphas, Optional, ...
          # do stuff, and get the final thing to return
          return ...
      
      parser = prepare_parser()
      

      【讨论】:

      • 该技术有效且易于操作,但并不常见,并且许多开发人员会对使用函数从全局范围隐藏导入的做法感到畏缩。简而言之,我不确定这应该是推荐的做法。将导入放入函数中通常只需要延迟导入(在调用函数时进行导入,而不是在加载模块时进行)。我指出这一点是因为 OP 要求 Pythonic 实践——还有其他技术可以在不本地化导入的情况下完成工作。
      • @RaymondHettinger 我的印象是,大多数开发人员根本不会费心在全局范围内隐藏导入。 (主要是处理命名空间中的额外值,或者导入模块并使用<module>.<member> 表示法,可能使用as 别名。)
      • 这实际上取决于您是否希望用户运行help(yourmodule)dir(yourmodule) 以发现API。这两种 API 发现技术都会受到命名空间混乱的影响。
      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多