我有一个包含常量的模块(数据类型和其他东西)。
让我们调用模块constants.py
让我们假装它包含以下内容:
# noinspection PyClassHasNoInit
class SimpleTypes:
INT = 'INT'
BOOL = 'BOOL'
DOUBLE = 'DOUBLE'
# noinspection PyClassHasNoInit
class ComplexTypes:
LIST = 'LIST'
MAP = 'MAP'
SET = 'SET'
这很漂亮而且效果很好,带有检查功能的IDE可以通过在编码时提供建议来提供帮助,这非常有用。 PyCharm示例如下:
但是,如果我现在有某种类型的值并想要检查它是否属于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('_')]
有了这个,可以做上面的例子。
答案 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