在Python 2代码中,我有这样的东西:
...
elif type(value) == datetime.date:
return transform_date(value)
elif type(value) == datetime.datetime:
return transform_datetime(value)
...
现在,如果我遵循避免"反模式"的建议,我应该用isinstance
替换它。
isinstance(value, datetime.date)
并且会出现一个问题,因为正确性将取决于我首先检查哪种类型。
我很清楚 10 多岁 如何在 Python 中比较对象的类型? 以及 在 Python 中检查类型的规范方法是什么? ,但这个问题在两个重要方面有所不同:
- 这是关于Python 3的,习语可能有所不同
- 我对精确检查感兴趣,因为转换取决于确切的类型(否则会有损(
完全匹配:例如,obj.__class__
或type(obj)
匹配。
就像在Python中一样,只有一种明显的方法可以做到这一点,这个问题的答案不应该那么依赖于意见。
如果你真的想要严格的每精确类匹配,pythonic 解决方案自 py2 以来没有改变: 使用字典
dispatch = {
datetime.date: transform_date,
datetime.datetime: transform_datetime,
# etc
}
transform = dispatch.get(type(value), some_default_func)
transform(value)