为什么 Python 中的类型检查被认为是一个坏主意?

Joh*_*eck 1 python typechecking

许多人都发表了这样的评论,但没有人给出它不好的原因。

还有什么方法可以捕获用户输入错误?等待其他地方的某些代码“抛出异常?” 为什么不立即捕获错误更好呢?

例如,(ab)用户输入 17.6 以获得预期的整数响应。这显然是一个错误,获取了预期类型​​类型(只是为了清楚?)。floatint

或者,假设该(ab)用户甚至输入 17/6 作为预期的float. 17/6一个float,因此如果等待数据到达实际使用的位置,则很难捕获此错误。

我不明白这个前提。

=========================== 以下是根据许多(非常好的)回复进行的编辑 - 感谢所有人!

首先,我相信所有编码风格都基于人们的意见,这些人已经学会根据他们遇到的一些错误提出这些意见。所以,是的,根据定义,由于这是一个编码风格的问题,所有答案都可能基于意见或导致那里的经验。

其次,我现在从评论中了解到,在函数中输入后测试类型。非常感谢您提供的示例和解释。

第三,正如许多评论所指出的那样,也许“类型测试不好”的意识形态应该在测试输入之后进行一些解释。这是我对我所做的搜索的许多回复中提出的笼统声明,试图测试在我的代码中获得的人工输入。

再次非常感谢你们分享的所有知识。

Die*_*Epp 5

举几个例子,

  1. 假设您需要将文件传递给函数。您真正想要的是一个类似文件的对象,这意味着您可以.write()在任何您喜欢的对象上实现该方法并将其传递给该函数。检查对象的类型是不好的,您需要验证对象是否具有正确的接口。

  2. 假设您从 numpy 数组中取出一些数字并以 JSON 格式将它们序列化到磁盘。哎呀!

    import numpy, json
    a = numpy.array([1, 2, 3], numpy.uint16)
    print(json.dumps(a[0]))
    
    Run Code Online (Sandbox Code Playgroud)

    当你运行它时,

    TypeError: 1 is not JSON serializable
    
    Run Code Online (Sandbox Code Playgroud)

    什么?显然,1JSON 可序列化的,但这是一个不同类型的 1。想象一下追踪此类错误的情况。谁知道这个数字出现在 numpy 数组中已经有多久了!

所以你想要进行输入验证,是的,因为这会在错误成为问题之前更早地捕获它们。但是,您不想简单地依赖于对象的类型,因为 Python 中的类型系统并不表达您实际想要的输入约束类型。

在其他语言中,约定是使用类型系统来表达对输入的约束。例如,类似文件的对象可以被实现为具有此类概念的语言中的类型类或接口。

也就是说,我认为如果您真的只需要一个int.