什么是 pythonic 方式告诉调用者函数给定参数支持的值是什么?
他是PyQt(用于GUI)的一个例子。说我有一个复选框,
class checkbox(object):
....
def setCheckState(self, value):
....
此处,setCheckState()
只应该预期已选中或未选中。
PyQt使用内置枚举(即Qt.Checked
或Qt.Unchecked
),但这很糟糕。我一直在文档中寻找我正在使用的对象的枚举。
显然PyQt是用 unpythonic C ++ sytle编写的。 应该如何在Python中处理这个或类似的问题?根据{{3}},enums似乎是最近添加的语言和非常具体的应用程序,所以我认为有/更好的方法来处理它?</ p>
当我的函数需要特定的参数值时,我想让我编写的代码易于使用 - 几乎就像函数的组合框一样。
答案 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
好的,我得到了我的方式错误 - 我把表现与价值混为一谈。
尽管如此,如果你想枚举一个更大的范围 - 在我的假方法中,你不必手动添加值。当然,如果你有序号。
我讨厌额外打字: - )