作为编写在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支持,只有Bytes需要显式标记。这符合python-future.org建议的方法: http://python-future.org/automatic_conversion.html#separating-text-from-bytes
我可以想办法用非常讨厌的grep做到这一点。 AST看起来也很有帮助。但我觉得以前有人已经解决了这个问题,所以我想问一下。
答案 0 :(得分:2)
您可能想要探索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)