python列表所有导入的模块通过*,pythonic方式导入

时间:2012-12-11 11:59:26

标签: python dynamic import extension-methods

说我有一个包“colorExtentions”,在我的__init__.py我有__all__=["red", "blue"]。通过将模块添加到目录和__all__列表,应该能够自动扩展此包。以下是否可接受或是否存在此类事情的另一种“最佳做法”?

import colorExtentions
from colorExtentions import *

for moduleName in colorExtentions.__all__:
    colors.append(moduleName)
promptUserToChoose(colors)

2 个答案:

答案 0 :(得分:3)

假设每种颜色都是一个类,我认为更好的解决方案是确保所有颜色都是单个类的子类(无论如何都是好的设计):

class Color:
    ...

然后,当您需要所有颜色的列表时,您只需导入包含类的任何模块,并执行:

from colorExtentions import *

colors = Color.__subclasses__()

这样,您最终会得到每个Color子类的列表。

请注意,在2.x中,您需要新式类(继承自object)才能使用__subclasses__()方法。

答案 1 :(得分:0)

官方Python文档中不鼓励从模块中导入所有名称。参见:

http://docs.python.org/2/howto/doanddont.html#from-module-import

引用:

  

什么时候好呢

     

在某些情况下,从模块导入*就可以了:

     
      
  • 互动提示。例如,从math import *制作Python   一个惊人的科学计算器。
  •   
  • 使用>扩展C中的模块时Python中的模块。
  •   
  • 当模块从import * safe。
  • 宣传自己时   

如果您坚持使用__all__ - 请使用其他名称,例如color_list,并动态扩展该变量。然后导入该变量:

import colorExtentions
from colorExtentions import color_list

colors.extends(color_list)