【问题标题】:Proper way to handle variable data types in Python在 Python 中处理可变数据类型的正确方法
【发布时间】:2014-11-10 16:59:51
【问题描述】:

我正在尝试编写一个 Python 类 Segment,它由两个 Vectors 组成,代表它的点和与这些点相关的函数。

Segments 可以相交,所以我正在尝试编写一个方法s1.intersect(s2),它返回有关 Segments s1 和 s2 如何相交的信息。根据段的不同,表示交叉点需要不同数量的点:

  1. 没有交点 -> 0 点(不需要特定的数据结构)
  2. 单个交叉点 -> 1 个点(需要单个 Vector
  3. 相交区域 -> 2 个点(需要 Segment

换句话说,不同的情况似乎需要 2-3 种数据类型。这很不方便,因为函数的用户必须手动区分它们。

以下是我能想到的返回这些数据类型的一些方法:

  • 返回包含 0、1 或 2 项的 Vector 列表。

这将获取信息并完成工作,但返回的值并不反映它们实际引用的数据类型——即VectorSegment,以及一些失败通知。

  • 返回不同的数据类型:VectorSegmentFalse

在这种情况下,用户必须使用isinstance 来区分它们,否则可能会出现无效类型问题。这也很丑。

  • 返回一个包装类Intersection,它存储VectorSegmentFalse

这样做的好处是每次都返回相同的数据类型,但用户仍然必须使用isinstance 来区分类型。

在 Python 中处理多种返回类型的最佳方法是什么?

【问题讨论】:

  • 我不确定你的问题是什么......你不必在 Python 中返回特定类型,所以你的 intersect() 方法可以根据什么返回这些中的任何一个它决定了。在结果处理代码中,您可以使用isinstancehasattr 或等效的东西来确定您收到了什么。
  • Intersection 类如何适应这个?
  • 哇...我忘了isinstance。基本问题,对不起:/
  • isinstance 很少需要,也不太可能是您问题的最 Pythonic 答案。
  • 为什么 2 不能是带有单个 VectorSegment,而 1 不能是空的 Segment。这样你根本不需要检查类型。

标签: python class types enums


【解决方案1】:

继续并返回NoneVectorSegment。这就是三种可能性,即使您将其包装起来,用户在某些时候也需要处理这些差异。

所以保持简单,让你的用户使用isinstance()(这完全是Pythonic)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多