【发布时间】:2011-01-14 13:35:02
【问题描述】:
有没有一种简单的方法来确定变量是列表、字典还是其他东西?我得到了一个可能是任何一种类型的对象,我需要能够区分它们。
【问题讨论】:
-
虽然总的来说我同意你的观点,但在某些情况下了解它会有所帮助。在这种特殊情况下,我做了一些快速的黑客攻击,最终我回滚了,所以这次你是对的。但在某些情况下(例如,在使用反射时),了解您正在处理的对象类型很重要。
-
@S.Lott 我不同意这一点;通过能够知道类型,您可以处理一些漂亮的变体输入并且仍然做正确的事情。它使您可以解决依赖于纯鸭子类型所固有的接口问题(例如,树上的 .bark() 方法意味着与狗完全不同的东西。)例如,您可以创建一个函数来做一些工作接受字符串(例如路径)、路径对象或列表的文件。都有不同的接口,但最终的结果是一样的:对那个文件做一些操作。
-
@S.Lott 我希望很明显这是一个人为的例子;尽管如此,这是鸭子打字的一个主要失败点,
try对此无济于事。例如,如果您知道用户可以传入字符串或数组,那么两者都是可索引的,但该索引意味着完全不同的东西。在这些情况下仅仅依靠 try-catch 会以意想不到和奇怪的方式失败。一种解决方案是制作一个单独的方法,另一种是添加一点类型检查。我个人更喜欢多态行为而不是做几乎相同事情的多种方法......但这只是我:) -
@S.Lott,单元测试怎么样?有时您希望您的测试验证一个函数是否返回了正确类型的内容。一个非常真实的例子是当你有类工厂时。
-
举一个不太人为的例子,考虑一个序列化器/反序列化器。根据定义,您正在用户提供的对象和序列化表示之间进行转换。序列化程序需要确定您传入的对象的类型,并且您可能没有足够的信息来确定反序列化的类型而不询问运行时(或者至少,您可能需要它进行健全性检查以在错误数据进入之前捕获它你的系统!)
标签: python dictionary types typeof