限制Python导入的范围

mat*_*ots 5 python namespaces

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

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.
Run Code Online (Sandbox Code Playgroud)

我喜欢调用方便from <package> import <etc>,但我只想在很小的代码段中使用它.我担心我会对命名空间污染做出贡献,因为我在同一个文件中有很多像这样的小片段.

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

Ray*_*ger 11

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

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

这些技术都由标准库中的核心开发人员使用.例如,十进制模块:

总之,这些技术使命名空间像吹口哨一样干净.


Amb*_*ber 7

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

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

parser = prepare_parser()
Run Code Online (Sandbox Code Playgroud)

  • 这项技术很容易实现,但这种情况并不常见,许多开发人员都会因使用函数隐藏全局范围内的导入而感到畏缩.简而言之,我不确定这应该是推荐的做法.将导入放在函数中通常只需要延迟导入(在调用函数时进行导入,而不是在加载模块时进行导入).我指出这一点是因为OP要求Pythonic实践 - 还有其他技术可以在不本地化导入的情况下完成工作. (3认同)
  • @RaymondHettinger我的印象是,大多数开发人员根本不愿意隐藏全球范围内的进口商品.(主要是处理命名空间中的额外值,或者导入模块并使用`<module>.<member>`表示法,可能使用`as`别名.) (2认同)
  • 这实际上取决于你是否希望用户运行``help(yourmodule)``或``dir(yourmodule)``来发现API.这两种API发现技术都受到命名空间混乱的影响. (2认同)