我想迭代一个变量,它可以是一个列表,也可以是一个字符串。问题是,我不想把字符串看作是字符列表:
[1, 2, 3] => [1, 2, 3]
["1", "2"] => ["1", "2"]
"123" => ["123"] # instead of ["1", "2", "3"]
for x in foo
适用于列表,但在假定foo是字符串的情况下对字符进行迭代。你知道吗
我知道这可以通过检查类型来实现(例如for x in (foo if type(foo) is list else [foo])
),但是我觉得一定有更好的方法。。。你知道吗
Tags:
不知道你为什么这样做-我相信你有一个很好的理由,我想指出,这可能是一个代码气味。。。你知道吗
很可能,在调用函数之前,您知道您是有一个列表还是一个字符串。在调用函数时,编写两个函数或将字符串放入列表中。瞧。不需要检查类型。你知道吗
如果你不知道你有什么样的结果,但应该(因为你想根据类型不同对待它),那么这也是一种代码气味-在你的代码中的某个地方,你不太清楚发生了什么,或者某个子系统的接口太模糊。你知道吗
所以。要么解决根本原因。或者检查函数中的类型。你知道吗
直截了当的方法确实是
为什么我说
isinstance(foo, basestring)
而不是说type(foo) is list
?你知道吗您的代码更有可能会有一些非列表序列对象,而非字符串类的对象非常少见。
作为Alex Martelli explains,最好使用
isinstance
,而不是检查确切的类型相等性,这样还可以包含子类。具体来说,您可能希望以相同的方式处理字节和Unicode字符串。
Alex说类型测试很难看,一般来说我同意,但是如果你需要用一种方式写出字符串,然后列出另一种方式,这是正确的方法。你知道吗
相关问题 更多 >
编程相关推荐