当前位置: 首页 > 面试题库 >

识别隐式字符串文字串联

穆浩皛
2023-03-14
问题内容

根据guido(以及其他一些Python程序员)的说法,隐式字符串文字串联被认为是有害的。因此,我试图识别包含此类串联的逻辑行。

我的第一次(也是唯一的尝试)是使用shlex;
我曾想过用来分割逻辑线posix=False,所以我将确定用引号引起来的部分,如果这些部分彼此相邻,则将其视为“文字级联”。

但是,这在多行字符串上失败,如以下示例所示:

shlex.split('""" Some docstring """', posix=False)
# Returns '['""', '" Some docstring "', '""']', which is considered harmful, but it's not

我可以调整这是一些奇怪的临时方法,但是我想知道您是否可以想到一个简单的解决方案。我的意图是将其添加到我已经扩展的pep8验证程序中。


问题答案:

有趣的问题,我只需要使用它,因为没有答案,所以我发布了该问题的解决方案:

#!/usr/bin/python

import tokenize
import token
import sys

with open(sys.argv[1], 'rU') as f:
    toks = list(tokenize.generate_tokens(f.readline))
    for i in xrange(len(toks) - 1):
        tok = toks[i]
        # print tok
        tok2 = toks[i + 1]
        if tok[0] == token.STRING and tok[0] == tok2[0]:
            print "implicit concatenation in line " \
                "{} between {} and {}".format(tok[2][0], tok[1], tok2[1])

您可以自己提供程序,结果应该是

implicit concatenation in line 14 between "implicit concatenation in line " and "{} between {} and {}"


 类似资料:
  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 问题内容: 字符串文字和字符串对象的添加有什么区别? 例如 为什么/ 不指向与相同的位置? 问题答案: 因为不是 常量表达式 ,由于和不是,因此其结果不会被插入,即创建另一个对象来表示它,因此引用比较产生。 JLS 3.10.5字符串文字 : 使用String.intern方法,对字符串常量(或更常见的是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。 J

  • 问题内容: 这是以前有关Java中的String初始化的一些问题的后续问题。 在用Java进行了一些小测试之后,我面临以下问题: 为什么我可以执行此语句 当str2一个String对象初始化为,但我不能调用方法toString()上str2?那么Java如何将空字符串对象和字符串文字串联起来? 顺便说一句,我还尝试将一个初始化为null和字符串文字的Integer连接起来,”a_literal_s

  • 当我有一个字符串需要将一个字符连接到它的结尾时,我应该更喜欢超过是否有任何性能原因? 我知道数组字符串连接和字符串生成器,我并不是在询问一般情况下如何连接字符串的建议。 我也知道有些人会有冲动向我解释过早的优化,而且一般来说我不应该为这些小事情费心,请不要... 我之所以问这个问题,是因为从编码风格的偏好来看,我更倾向于使用后一个,但我觉得第一个应该表现得稍微好一点,因为知道所附加的只是一个字符,

  • 问题内容: 之间有什么区别 和 问题答案: 当你使用字符串文字时,可以将字符串嵌入,但是当你使用时,你将获得一个新的字符串对象。 在此示例中,两个字符串文字均引用相同的对象: 在这里,创建了2个不同的对象,它们具有不同的引用: 通常,应尽可能使用字符串文字表示法。它更易于阅读,并且为编译器提供了优化代码的机会。

  • 问题内容: 当我将用户作为查询字符串(使用$ http中的参数)传递给用户,并设置Web api方法以在uri中寻找用户时,一切都变得如桃子。但是当我按如下所示将其传递时,用户显示为null。我在这里想念什么? 角函数 网络API动作 问题答案: 试试:代替。 在asp.net api中, 整个请求主体 都绑定到一个参数。出于这个原因,你 不能有多个参数 用在动作方法的参数。只有一个=>,我们不需