0

假设我有一个包“colorExtentions”,并且在我的包中__init__.py__all__=["red", "blue"]. 这个包应该能够通过将模块添加到目录和__all__列表来自动扩展。以下是可以接受的还是对于此类事情是否有另一种“最佳实践”?

import colorExtentions
from colorExtentions import *

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

2 回答 2

3

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

class Color:
    ...

然后,当您想要所有颜色的列表时,您可以简单地导入任何包含这些类的模块,然后执行以下操作:

from colorExtentions import *

colors = Color.__subclasses__()

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

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

于 2012-12-11T12:12:04.033 回答
0

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

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

引用:

什么时候就好了

在某些情况下 from module import * 就可以了:

  • 交互式提示。例如,from math import * 使 Python 成为一个了不起的科学计算器。
  • 在 Python 中使用 > 模块扩展 C 中的模块时。
  • 当模块将自己宣传为 from import * safe 时。

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

import colorExtentions
from colorExtentions import color_list

colors.extends(color_list)
于 2012-12-11T12:10:46.307 回答