python - 在 Python 中查找/测试未修饰的字符串文字(没有 b"或 u")

标签 python testing string-literals python-2to3

作为编写在 Python 2 和 3 上一致工作的代码的一部分,我想测试任何未修饰的字符串文字(任何开头的 "或 ' 前面没有 b 或 u)。

我很擅长编写测试用例,所以我只需要一个函数来返回我的 .py 文件中所有未修饰的字符串文字。

例如,假设我有包含以下内容的 Python 代码:

example_byte_string = b'这是一串ASCII文本或字节'

example_unicode_string = u"这是一个 Unicode 字符串"

example_unadorned_string = '这个字符串没有以任何方式标记,在 Python 2 中将被视为字节,但在 Python 3 中将被视为 Unicode'

example_unadorned_string2 = "这就是他们所说的'字符串'!"

example_unadorned_string3 = '约翰说“真的吗?”非常大声'

我想找到所有没有明确标记的字符串,比如 example_unadorned_string,这样我就可以正确标记它们,从而使它们在 Python 2 和 3 中运行时表现相同。它也很好适应字符串中的引号,例如 example_unadorned_string2 和 3,因为这些不应将 u/b 添加到内部引号中。显然,从长远来看,我们将放弃对 Python 2 的支持,只有字节需要显式标记。这与 python-future.org 推荐的方法一致: http://python-future.org/automatic_conversion.html#separating-text-from-bytes

我可以想出用非常讨厌的 grep 来做到这一点的方法。 AST 看起来也可能有帮助。但我觉得以前肯定有人解决过这个问题,所以我想问一下。

最佳答案

您可能想要探索 tokenize 模块(python2python3)。一个粗略的 Python 3 示例是这样的:

import tokenize
import token

def iter_unadorned_strings(f):
    tokens = tokenize.tokenize(f.readline)
    for t in tokens:
        if t.type == token.STRING and t.string[0] in ['"', "'"]:
            yield t

fname = r'code_file.py'
if __name__ == '__main__':
    with open(fname, 'rb') as f:
        for s in iter_unadorned_strings(f):
            print(s.start, s.end, s.string)

关于python - 在 Python 中查找/测试未修饰的字符串文字(没有 b"或 u"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50656074/

相关文章:

python - scipy.optimize.curve_fit 错误 - 函数结果不是正确的 float 组

Maven Spring 测试中的 springTestContextBeforeTestMethod 失败

c++ - 使用字符串化运算符将字符串值而不是 const 字符串文字传递给宏

string - Go 中对字符串字面量的引用

python - 以算法和公平的方式拆分账单,之后是 :)

python - 值错误 : continuous is not supported

Python-多处理

perl - 在 TAP 中静音警告

c# - 测试验证 C#

typescript - 如何在 Typescript 中定义递归字符串文字类型