Enums周围的Pythonic方式

时间:2016-10-13 18:35:46

标签: python python-2.7 function parameters enums

什么是 pythonic 方式告诉调用者函数给定参数支持的值是什么?

他是PyQt(用于GUI)的一个例子。说我有一个复选框,

class checkbox(object):
    ....
    def setCheckState(self, value):
        ....

此处,setCheckState()只应该预期已选中未选中

PyQt使用内置枚举(即Qt.CheckedQt.Unchecked),但这很糟糕。我一直在文档中寻找我正在使用的对象的枚举。

显然PyQt是用 unpythonic C ++ sytle编写的。 应该如何在Python中处理这个或类似的问题?根据{{​​3}},enums似乎是最近添加的语言和非常具体的应用程序,所以我认为有/更好的方法来处理它?<​​/ p>

当我的函数需要特定的参数值时,我想让我编写的代码易于使用 - 几乎就像函数的组合框一样。

2 个答案:

答案 0 :(得分:1)

一种明显的方式是功能注释。

class CheckBox(enum.Enum):
    Off = 0
    On = 1

def setCheckState(self, value: CheckBox):
    ...

这清楚地表明value应该是CheckBox的一个实例。拥有Enum只会让事情变得更容易。

但是,2.7中没有直接支持注释本身。常见的解决方法包括将该信息放在函数文档字符串(各种工具可以找到它)或注释中(我们已经知道)。

如果要为自己的代码寻找方法:使用注释装饰器。这具有继续在3 +中工作的优点:

class annotate(object):
    def __init__(self, **kwds):
        self.kwds = kwds
    def __call__(self, func):
        func.__annotations__ = self.kwds

@annotate(value=CheckBox)
def setCheckState(self, value):
    ...

要成为一个强大的装饰器,它应该检查kwds的内容是否与函数参数名匹配。

答案 1 :(得分:0)

这将成功

import collections

def create_enum(container, start_num, *enum_words):
    return collections.namedtuple(container, enum_words)(*range(start_num, start_num + len(enum_words)))

Switch = create_enum('enums', 1, 'On', 'Off')

开关是你的枚举:

In [20]: Switch.On
Out[20]: 1

In [21]: Switch.Off
Out[21]: 2

好的,我得到了我的方式错误 - 我把表现与价值混为一谈。

尽管如此,如果你想枚举一个更大的范围 - 在我的方法中,你不必手动添加值。当然,如果你有序号。

我讨厌额外打字: - )