Python:可以在组上迭代的分组常量

2024-09-26 22:53:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

让我们呼叫模块常量.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

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

为了进一步澄清,我想做些类似的事情:

^{pr2}$

当然,如果我用constants模块中的所有类型创建一个“ComplexTypeList”列表,这当然是可能的,但是每次我都要向两个位置添加新类型(类和列表),是否可以动态地执行某些操作?在

我希望它能在Python2.7中工作,不过关于如何在python的更高版本中实现这一点的建议也是非常有用的。在

解决方案意见:

我使用了inspect,正如Prune在下面标记的解决方案中建议的那样。我把上面提到的名单列在常量.py模块组件:

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

这样就可以做上面的例子了。在


Tags: 模块py类型map建议listclassint
3条回答

如果我正确地理解了这个问题,您需要定义一个自定义type。您不需要真正导入任何模块。有很多方法可以做到这一点,例如元类,但是,一个简单的方法如下:

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

var = my_type()

现在可以测试类型:

^{pr2}$

返回:

__main__.ComplexTypes

换句话说:

type(var) is my_type

返回True

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

我想我有了。你可以使用inspect.getmembers返回模块中的项目。每个项目都是一个元组(namevalue)。我用下面的代码试过了。dir只给出模块成员的名称;getmembers也返回值。您可以在每个元组的第二个元素中查找所需的值。在

在常量.py在

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

测试代码

^{pr2}$

输出:

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

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

getmembers(ComplexTypes, inspect.isfunction)

得到函数。是的,你可以用这样一个简单的软件包来删除东西。我看不出一种方法能让你得到一个正的常数。见documentation。在

相关问题 更多 >

    热门问题