在Python中查找/测试未修饰的字符串文本(没有b“或u”)

2024-05-11 03:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

作为编写在python2和python2和python3上一致工作的代码的一部分,我想测试是否有任何未加修饰的字符串字面值(任何开头没有b或u的“或”开头)。在

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

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

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

example_unicode_string=u“这是unicode字符串”

example_unadorned_string='此字符串没有以任何方式标记,在Python2中将被视为字节,但在Python3中被视为Unicode”

example_unadorned_string2=“这就是他们所说的‘字符串’!”在

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

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

我能想出对付grep的方法。AST看起来也有潜在的帮助。但我觉得肯定有人已经解决了这个问题,所以我想问问。在


Tags: 方法字符串代码标记文本string字节example
1条回答
网友
1楼 · 发布于 2024-05-11 03:20:23

您可能想探索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)

相关问题 更多 >