Find/Test 用于 Python 中未修饰的字符串文字(没有 b" 或 u")
Find/Test for unadorned string literals (no b" or u") in Python
作为编写在 Python 2 和 3 上一致工作的代码的一部分,我想测试任何未修饰的字符串文字(任何开头的 " 或 ' 前面没有 b 或 u) .
我很擅长编写测试用例,所以我只需要一个函数 returns 我的 .py 文件中所有未修饰的字符串文字。
例如,假设我有 Python 包含以下内容的代码:
example_byte_string = b'这是一串ASCII文本或字节'
example_unicode_string = 你"This is a Unicode string"
example_unadorned_string = 'This string was not marked either way and would be treated as bytes in Python 2, but Unicode in Python 3'
example_unadorned_string2 = "This is what they call a 'string'!"
example_unadorned_string3 = 'John said "Is it really?" very loudly'
我想找到所有未明确标记的字符串,例如 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
模块 (python2, python3)。一个粗略的 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 2 和 3 上一致工作的代码的一部分,我想测试任何未修饰的字符串文字(任何开头的 " 或 ' 前面没有 b 或 u) .
我很擅长编写测试用例,所以我只需要一个函数 returns 我的 .py 文件中所有未修饰的字符串文字。
例如,假设我有 Python 包含以下内容的代码:
example_byte_string = b'这是一串ASCII文本或字节'
example_unicode_string = 你"This is a Unicode string"
example_unadorned_string = 'This string was not marked either way and would be treated as bytes in Python 2, but Unicode in Python 3'
example_unadorned_string2 = "This is what they call a 'string'!"
example_unadorned_string3 = 'John said "Is it really?" very loudly'
我想找到所有未明确标记的字符串,例如 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
模块 (python2, python3)。一个粗略的 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)