【发布时间】:2015-05-17 07:19:07
【问题描述】:
我有一个类CameraInterface,它有两个属性:
-
recording(布尔值) -
recording_quality(具有三个可能值的枚举)
用户可以通过硬件按钮(这是一个树莓派项目)选择recording_quality,但是如果摄像头已经是recording,硬件会闪烁/嗡嗡声/否则表示无法更改recording_quality 在您录制时。
我希望 CameraInterface 对象强制执行此要求。我不希望未来的我能够忘记这个要求,并且在没有先确定recording is False 的情况下不小心尝试设置recording_quality。最 Pythonic 的方式是什么?
我最熟悉 Objective-C,我可能会尝试在外部创建属性 readonly,然后执行以下操作:
- (void)setQuality:(Quality)quality
successHandler:(void (^)(void))successHandler
failureHandler:(void (^)(void))failureHandler
{
if ( self.recording ) {
if ( failureHandler ) {
failureHandler();
}
}
else {
self.quality = quality; // internally writable
if ( successHandler ) {
successHandler();
}
}
}
更新
澄清我在寻找什么:
- 如果可能,我希望避免对控制流使用异常。
- 我想将
recording_quality的有时可设置性质构建到CameraInterface的编程接口中,这样您就不必等到运行时才发现自己做错了什么。 - 我已经了解 Python 属性。我只是在寻找使用它们的最佳方法(或替代方法)。
更新 2
Martijn Pieters’s answer 说服我使用运行时异常,并在尝试设置 recording_quality 时使用 try/catch。让我信服的部分原因是尝试在 Python 中实现我的 Objective-C 示例。在这样做的过程中,我意识到它确实更适合静态类型语言。让我信服的部分原因是 Martijn 的答案中链接的答案,它更详细地解释了异常是 Python 控制流中完全正常的一部分。
这是我上面的 Objective-C 示例的 Python 版本。我把它留在这里作为对其他人的警告:
import types
class CameraInterface(object):
def __init__(self):
self._recording_quality = 1
self.recording = False
@property
def recording_quality(self):
return self._recording_quality
def set_recording_quality(self, quality, success_handler, failure_handler):
if type(success_handler) is not types.FunctionType:
raise ValueError("You must pass a valid success handler")
if type(failure_handler) is not types.FunctionType:
raise ValueError("You must pass a valid failure handler")
if self.recording is True:
# reject the setting, and call the failure handler
failure_handler()
else:
self._recording_quality = quality
success_handler()
def success():
print "successfully set"
def failure():
print "it was recording, so we couldn't set the quality"
camera = CameraInterface()
print "recording quality starting at {0}".format(camera.recording_quality)
camera.set_recording_quality(3, success, failure)
camera.recording = True
camera.set_recording_quality(2, success, failure)
打印出来:
recording quality starting at 1
successfully set
it was recording, so we couldn't set the quality
【问题讨论】:
标签: python python-2.7 properties setter