Python:分组常量,可以迭代组

时间:2016-01-29 00:37:21

标签: python

我有一个包含常量的模块(数据类型和其他东西)。

让我们调用模块constants.py

让我们假装它包含以下内容:

# noinspection PyClassHasNoInit
class SimpleTypes:
    INT = 'INT'
    BOOL = 'BOOL'
    DOUBLE = 'DOUBLE'

# noinspection PyClassHasNoInit
class ComplexTypes:
    LIST = 'LIST'
    MAP = 'MAP'
    SET = 'SET'

这很漂亮而且效果很好,带有检查功能的IDE可以通过在编码时提供建议来提供帮助,这非常有用。 PyCharm示例如下:

IDE Help

但是,如果我现在有某种类型的值并想要检查它是否属于ComplexTypes,而不是在另一个地方定义它们。这有可能吗?

为了澄清更多,我希望能够做到这样的事情:

if myVar in constants.ComplexTypeList:
    # do something

如果我在常量模块中创建了包含所有类型的列表“ComplexTypeList”,那当然是可能的,但是我每次都要向两个位置添加潜在的新类型(包括类和列表),是否有可能动态地做某事?

我希望它在python 2.7中工作,尽管在python的更高版本中如何执行此操作的建议也是有用的知识。

解决方案评论:

我使用了检查,正如Prune在下面的标记解决方案中所建议的那样。我在constants.py模块中将上面提到的列表作为:

ComplexTypeList = [m[1] for m in inspect.getmembers(ComplexTypes) if not m[0].startswith('_')]

有了这个,可以做上面的例子。

3 个答案:

答案 0 :(得分:2)

内置方法.dir(class)将返回给定类的所有属性。因此,您的if语句可以是if myVar in dir(constants.ComplexTypes):

答案 1 :(得分:2)

我想我拥有它。您可以使用 inspect.getmembers 返回模块中的项目。每个项目都是(名称)的元组。我用以下代码尝试了它。 dir 仅提供模块成员的名称; getmembers 也会返回值。您可以在每个元组的第二个元素中查找所需的值。

constants.py

class ComplexTypes:
    LIST_N = 'LIST'
    MAP_N  = 'MAP'
    SET_N  = 'SET'

测试代码

from constants import ComplexTypes
from inspect import getmembers, isfunction

print dir(ComplexTypes)

for o in getmembers(ComplexTypes):
    print o

输出:

['LIST_N', 'MAP_N', 'SET_N', '__doc__', '__module__']
('LIST_N', 'LIST')
('MAP_N', 'MAP')
('SET_N', 'SET')
('__doc__', None)
('__module__', 'constants')

您可以使用各种运算符请求特定类型的对象,例如

getmembers(ComplexTypes, inspect.isfunction)

获取功能。是的,你可以用这么简单的包去除东西。我没有看到一种以积极的方式让你获得常数的方法。请参阅documentation

答案 2 :(得分:1)

如果我已正确理解问题,您需要定义自定义type。你真的不需要导入任何模块。您可以通过多种方式执行此操作,例如:但是,meta类的一个简单方法如下:

my_type = type('ComplexTypes', (object,), {'LIST': 'LIST'})

var = my_type()

现在您可以测试类型:

type(var)

返回:

__main__.ComplexTypes

换句话说:

type(var) is my_type

返回True