最近我们在代码中发现了一些错误,因为开发人员忘记在字符串列表中添加逗号而python只是连接字符串。 看下面:
目标清单是: [“abc”,“def”]
开发人员写道: [ “ABC” “DEF”]
我们得到了:[“abcdef”]
现在我担心代码其他部分的类似错误,这个功能是python的核心部分吗?可以禁用它吗?
答案 0 :(得分:8)
是的,这是core part of python:
可能是多个相邻的字符串文字(由空格分隔) 允许使用不同的引用约定,其含义是 与他们的串联相同。因此,
"hello" 'world'
是等价的 到"helloworld"
。
我认为有一种方法可以禁用它,而不是攻击Python本身。
但是,您可以使用下面的脚本tokenize代码,并在找到多个相邻字符串时发出警告:
import tokenize
import token
import io
import collections
class Token(collections.namedtuple('Token', 'num val start end line')):
@property
def name(self):
return token.tok_name[self.num]
def check(codestr):
lastname = None
for tok in tokenize.generate_tokens(io.BytesIO(codestr).readline):
tok = Token(*tok)
if lastname == 'STRING' and lastname == tok.name:
print('ADJACENT STRINGS: {}'.format(tok.line.rstrip()))
else:
lastname = tok.name
codestr = '''
'hello'\
'world'
for z in ('foo' 'bar', 'baz'):
x = ["abc" "def"]
y = [1, 2, 3]
'''
check(codestr)
产量
ADJACENT STRINGS: 'hello''world'
ADJACENT STRINGS: for z in ('foo' 'bar', 'baz'):
ADJACENT STRINGS: x = ["abc" "def"]