【问题标题】:is there any way to stop python to concatanate space delimited strings?有没有办法阻止python连接空格分隔的字符串?
【发布时间】:2014-11-19 12:58:44
【问题描述】:

最近我们在基于代码的代码中发现了一些错误,因为开发人员忘记在字符串列表中间添加逗号,而 python 只是连接了字符串。 往下看:

预期的列表是: ["abc", "def"]

开发者写道: [“ABC” “定义”]

我们得到:["abcdef"]

现在我担心代码的其他部分有类似的错误,这个功能是 python 的核心部分吗?可以禁用吗?

【问题讨论】:

  • grep -IrH '"[^"]*"\s\+"[^"]*"' * 可以帮忙
  • 这将是为您的代码编写测试的良好动力。
  • 为什么不使用断言来验证序列的长度?

标签: python string-concatenation


【解决方案1】:

是的,这是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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2016-06-29
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多