2012-04-28 62 views
5

我有一些代码,看起来像这样:限制Python的范围导入

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>的方便,但我只希望它的代码非常小部分被使用。恐怕我会对命名空间污染做出贡献,因为我在同一个文件中有许多这样的小片段。

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

回答

7

一个简单的方法是使用功能范围,在一个文件中控制进口的知名度:

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

parser = prepare_parser() 
+3

该技术的工作原理很简单,但很少见,许多开发人员会对使用函数从全局范围隐藏导入的做法感到畏惧。总之,我不确定这应该是一个推荐的做法。将函数放入函数通常只会在导入需要延迟的情况下完成(在调用函数时进行导入,而不是在加载模块时执行导入)。我指出了这一点,因为OP正在要求Pythonic的做法 - 还有其他技术可以在不本地化进口的情况下完成工作。 – 2012-04-28 04:23:23

+2

@RaymondHettinger我的印象是,大多数开发人员根本就懒得隐藏全球范围内的进口商品。 (主要或者只是处理命名空间中的额外值,或者导入模块并使用'.0.''符号,可能带有as as aliasing。) – Amber 2012-04-28 04:24:14

+2

这真的取决于您是否期望用户运行''help(yourmodule )''或''dir(yourmodule)''来发现API。这两种API发现技术都受名称空间混乱的影响。 – 2012-04-28 04:28:55

11

通常的方式来控制命名空间的污染是

  1. 使用
  2. 使用后删除变量__all__变量
  3. 使用导入 - 对于下划线的变量名称

这些技术全部由标准库中的核心开发人员使用。例如,小数模块:

综合起来,这些技术使命名空间保持清洁,像哨子一样。