我想迭代一个变量,它可以是一个列表或一个字符串.问题是,我不想将字符串视为字符列表:
[1, 2, 3] => [1, 2, 3]
["1", "2"] => ["1", "2"]
"123" => ["123"] # instead of ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
for x in foo 适用于列表,但迭代字符,假设foo是一个字符串.
我知道这可以通过检查类型(例如for x in (foo if type(foo) is list else [foo]))来完成,但我觉得必须有更好的方法......
确实是直截了当的方式
for x in ([foo] if isinstance(foo, basestring) else foo)
Run Code Online (Sandbox Code Playgroud)
为什么我说isinstance(foo, basestring)而不是说type(foo) is list?
您的代码更可能具有一些非列表序列对象,而非字符串类似对象则非常罕见.
正如Alex Martelli所解释的那样,使用它isinstance比检查确切的类型相等更好,这样你也可以包含子类.
具体来说,您可能希望以相同的方式处理字节和Unicode字符串.
亚历克斯说测试类型是丑陋的,一般我同意,但如果你需要以一种方式写出字符串并列出另一种方法,这是正确的方法.