可迭代对象可以是字符串或序列¶
ID: py/iteration-string-and-sequence
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- reliability
- maintainability
- non-local
Query suites:
- python-security-and-quality.qls
for
语句旨在允许你迭代序列或其他可迭代对象的元素。Python 中的字符串是可迭代的,并且经常以这种方式使用。然而,它们也经常被认为不是字符序列,而是原子实体。
Python 中的一个缺陷来源是错误地迭代非可迭代对象,例如整数。这种缺陷很容易检测到,因为将引发 TypeError
。但是,如果字符串被错误地用作 for
语句中的可迭代对象,而该语句也接收其他序列(如列表),则代码将逐个字符迭代字符串。这可能不是程序员的意图,并会导致难以发现的错误。
建议¶
由于这种缺陷通常表示逻辑错误,因此无法给出解决缺陷的一般方法。但是,添加一个检查迭代器是否不是字符串的保护措施可能是值得的。
示例¶
在这个示例中,循环可能会迭代 "Hello"
,每行产生一个字符,以及迭代 [ "Hello", "World" ]
。程序员很可能忘记将 "Hello"
括在方括号中。
#Mistakenly mixed list and string
def greeting():
if is_global():
greet = [ "Hello", "World" ]
else:
greet = "Hello"
for word in greet:
print(word)
#Only use list
def fixed_greeting():
if is_global():
greet = [ "Hello", "World" ]
else:
greet = [ "Hello" ]
for word in greet:
print(word)
参考¶
Python 语言参考:for 语句,object.iter。
Python 标准库:迭代器类型。
Scipy 讲义:迭代器、生成器表达式和生成器。