【问题标题】:How to (should I) implement a model consistency in Python?如何(应该)在 Python 中实现模型一致性?
【发布时间】:2014-10-23 11:49:28
【问题描述】:

我想通过添加一些一致性检查来增强我的模型的实现(这个值不能是负数,这个值不能是 None 等)

我想知道添加一些“类型检查”-ish 检查是否是“Pythonic”。例如,检查我放入 Car 中的对象是否确实是 SteeringWheel。

我确实想执行某种类型检查以尽快发现错误。我想知道我是否在将 SteeringWheel 放入汽车的那一刻添加了正确的 SteeringWheel,而不是在汽车第一次转弯时(然后在汽车残骸中调试我的方式,直到找到错误的分配)。

我读到在 Python 的鸭子类型哲学中更多的是检查添加的对象的属性或方法而不是其类型。我理解这个原则,但这意味着模型必须知道如何使用对象才能检查给定对象是否正确,这会在模型和控制器之间产生错误的依赖关系。

此外,应该测试哪些属性? wheel.rotate() 可以应用于 SteeringWheel,也可以应用于轮胎。

另一种方法是让模型保持原样,并通过 try-catch 包围 每次对模型对象的使用,期望为 AttributeError 或 TypeError,然后会很麻烦。

也许我想要这个是错误的,如果有人能说服我我有错误的想法,请这样做。但是,如果您认为我想要一个在不一致时引发错误的模型是正确的,您能告诉我除了使用isinstance() 之外的其他方法吗?

谢谢。

【问题讨论】:

标签: python model typechecking data-consistency


【解决方案1】:

您可能想在此处使用 AbstractBaseClasses (https://docs.python.org/2/library/abc.html)。 pep 3119 (http://legacy.python.org/dev/peps/pep-3119/#rationale) 中的基本原理正是关于您的问题(确保对象支持给定协议而无需临时检查或严格的类型检查)。

【讨论】:

  • 据我了解这个 PEP,ABC 只允许开发人员实现 __instancecheck__ 方法并由 isinstance() 调用。除了棘手的情况,我看不出这比内置的isinstance() 更好。
  • @Mankalas:还有更多。关键是您可以在一个包中定义一个 ABC(=> 您期望的协议),在第二个包中定义一个兼容的类,并将这个第二个类注册为您的 ABC 在第三个包中的有效实现。这意味着可以使用任何现有的兼容类,而不必对依赖项/继承等进行硬编码。FWIW,因为 Python 允许您重新绑定方法,甚至在运行时更改对象的类,即使“严格”类型检查也不会保护您免受运行时错误的影响,因为通过类型检查后,对象可以更改其类
  • 感谢您的解释。我似乎确实解决了我的问题并遵守了鸭子打字理念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多