检查某个对象是否为列表
怎么最简单地检查一个东西是不是列表呢?
有一个方法叫 doSomething
,它有两个参数 a
和 b
。在这个方法里,它会循环遍历列表 a
并做一些事情。我想在开始循环之前,先确认一下 a
是不是一个 list
,这样可以避免出错,或者不小心传入一个字符串,结果每次循环只得到一个字母。
这个问题肯定有人问过,不过我在网上找的时候没有找到相关的答案。谢谢!
4 个回答
我想要一种方法来确保变量a是一个列表,然后再进行循环。
给这个函数写个说明。
类型检查会让你的代码变得不够通用、简单和易于维护。在好的、标准的Python程序中,这种检查很少被使用。
人们想要进行类型检查主要有两个原因:
如果调用者提供了错误的类型,就发出错误提示。
但这其实不值得你花时间去做。如果用户提供了不兼容的类型,程序在运行到不兼容的地方时就会自动报错。虽然有时候这个错误可能不会立刻出现,但通常不会拖太久。而且这样做能让你的代码更稳健、更简单、更高效,也更容易编写。
很多人坚持要做类型检查,希望能抓住用户可能犯的所有低级错误。但如果用户真的想做一些很傻的事情,你是没办法阻止他的。类型检查主要是为了防止用户带着自己的类型来替代你预期的类型,或者当用户意识到你的函数应该是多态的,提供了不同但能接受相同操作的类型。
如果我有一个大系统,里面有很多不同的人做的东西需要配合得很好,我会使用像
zope.interface
这样的系统来测试一切是否能正确配合。根据接收到的参数类型做不同的事情。
这样会让你的代码变得更糟,因为你的API不一致。一个函数或方法应该只做一件事,而不是做根本不同的事情。这种做法通常不是值得支持的特性。
一个常见的场景是,参数可以是一个foo或者一个foo的列表。更好的解决方案是直接接受一个foo的列表。这样你的代码会更简单、更一致。如果只需要一个foo是一个重要且常见的用例,你可以考虑再写一个方便的方法/函数,调用那个接受foo列表的函数,这样也不会损失任何功能。提供第一个API不仅会让事情变得更复杂和不一致,而且当类型不是预期的确切值时,程序会出错;在Python中,我们是根据对象的能力来区分,而不是根据它们的实际类型。通常来说,接受一个任意的可迭代对象或者序列,而不是特定的列表,几乎总是更好的选择。
如你所见,我认为在正常情况下,这两个理由都不足以支持进行类型检查。
为了支持更多的使用场景,同时仍然把字符串当作单一的值来处理,不要检查变量a是否是一个列表,而是检查它不是一个字符串。
if not isinstance(a, basestring):
...