检查某些内容是否为列表的最简单方法是什么?
方法doSomething
的参数为a
和b
。在该方法中,它将遍历列表a
并执行某些操作。在循环之前,我想要一种确保a
是list
的方法 - 从而避免错误或传递字符串然后从每个循环中取回一封信的不幸情况。
之前一定要问过这个问题 - 但是我的谷歌让我失望了。欢呼声。
答案 0 :(得分:15)
要启用更多用例,但仍将字符串视为标量,请不要检查是否为列表,请检查它是否为字符串:
if not isinstance(a, basestring):
...
答案 1 :(得分:10)
Typechecking会损害代码的通用性,简单性和可维护性。它很少用于优秀的惯用Python程序。
人们想要进行类型检查有两个主要原因:
如果调用者提供了错误的类型,则发出错误。
这不值得你花时间。如果用户为您正在执行的操作提供了不兼容的类型,则在达到兼容性时将引发错误。令人担忧的是,这可能不会立即发生,但它通常不会花费很长时间,导致代码更健壮,更简单,更高效,更容易编写。
人们常常坚持这一点,希望他们可以捕捉用户可以做的所有愚蠢的事情。如果用户愿意做任意愚蠢的事情,那么你无能为力阻止他。 Typechecking主要有可能让一个用户进入他自己的类型,这些用户可以直接替换被替换的用户,或者当用户认识到你的函数实际上应该是多态的并提供可以接受相同操作的不同内容时。 / p>
如果我有一个庞大的系统,很多人做的很多东西应该合适,我会使用像zope.interface
这样的系统来测试所有东西是否合适。
根据收到的参数类型做不同的事情。
这使您的代码更糟糕,因为您的API不一致。功能或方法应该做一件事,而不是根本不同的事情。这最终成为一项通常不值得支持的功能。
一个常见的情况是让一个参数可以是foo或foos列表。更清洁的解决方案就是接受一个foos列表。您的代码更简单,更一致。如果它是一个重要的常见用例,只有一个foo,你可以考虑使用另一个方便的方法/函数来调用接受foos列表并且什么都不会丢失的方法/函数。提供第一个API不仅会更复杂,也更不一致,但是当类型不是预期的确切值时,它会中断;在Python中,我们根据对象的功能区分对象,而不是实际类型。接受任意迭代或序列而不是列表以及任何像foo一样工作的东西,而不是特别需要foo,这几乎总是更好。
正如你所知,我认为在正常情况下,任何一个理由都不足以引起人们的反对。
答案 2 :(得分:7)
在循环播放
之前,我想要一种确保a是列表的方法
记录功能。
答案 3 :(得分:5)
通常认为在Python中执行类型检查不是一种好的风格,但请尝试
if isinstance(a, list):
...
(我想你也可以检查a.__iter__
是否存在。)