如何避免将字符串视为字符序列?

2024-04-20 12:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想迭代一个变量,它可以是一个列表,也可以是一个字符串。问题是,我不想把字符串看作是字符列表:

[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: of字符串in类型列表foriffoo
2条回答

不知道你为什么这样做-我相信你有一个很好的理由,我想指出,这可能是一个代码气味。。。你知道吗

很可能,在调用函数之前,您知道您是有一个列表还是一个字符串。在调用函数时,编写两个函数或将字符串放入列表中。瞧。不需要检查类型。你知道吗

如果你不知道你有什么样的结果,但应该(因为你想根据类型不同对待它),那么这也是一种代码气味-在你的代码中的某个地方,你不太清楚发生了什么,或者某个子系统的接口太模糊。你知道吗

所以。要么解决根本原因。或者检查函数中的类型。你知道吗

直截了当的方法确实是

for x in ([foo] if isinstance(foo, basestring) else foo)

为什么我说isinstance(foo, basestring)而不是说type(foo) is list?你知道吗

  • 您的代码更有可能会有一些非列表序列对象,而非字符串类的对象非常少见。

  • 作为Alex Martelli explains,最好使用isinstance,而不是检查确切的类型相等性,这样还可以包含子类。

  • 具体来说,您可能希望以相同的方式处理字节和Unicode字符串。

Alex说类型测试很难看,一般来说我同意,但是如果你需要用一种方式写出字符串,然后列出另一种方式,这是正确的方法。你知道吗

相关问题 更多 >