[英]How to make Python 2.x Unicode strings not print as u'string'?
[英]Python 2.x: how to automate enforcing unicode instead of string?
如何自動執行測試以強制Python 2.x代碼的主體不包含字符串實例(僅限unicode實例)?
例如。
我可以在代碼中執行此操作嗎?
是否有具有此功能的靜態分析工具?
編輯:
我想在Python 2.5中使用這個應用程序,但事實證明這不可能,因為:
unicode_literals
所以我接受了答案,說這是不可能的,即使它是由於不同的原因:)
在我看來,你真的需要用一個誠實的善良的python解析器來解析代碼。 然后,您將需要深入了解解析器生成的AST,以查看它是否包含任何字符串文字。
看起來Python帶有開箱即用的解析器。 從這個文檔我得到這個代碼示例工作:
import parser
from token import tok_name
def checkForNonUnicode(codeString):
return checkForNonUnicodeHelper(parser.suite(codeString).tolist())
def checkForNonUnicodeHelper(lst):
returnValue = True
nodeType = lst[0]
if nodeType in tok_name and tok_name[nodeType] == 'STRING':
stringValue = lst[1]
if stringValue[0] != "u": # Kind of hacky. Does this always work?
print "%s is not unicode!" % stringValue
returnValue = False
else:
for subNode in [lst[n] for n in range(1, len(lst))]:
if isinstance(subNode, list):
returnValue = returnValue and checkForNonUnicodeHelper(subNode)
return returnValue
print checkForNonUnicode("""
def foo():
a = 'This should blow up!'
""")
print checkForNonUnicode("""
def bar():
b = u'although this is ok.'
""")
打印出來的
'This should blow up!' is not unicode!
False
True
現在doc字符串不是unicode但應該被允許,所以你可能需要做一些更復雜的事情,比如from symbol import sym_name
,你可以在其中查找哪些節點類型用於類和函數定義。 然后,應該允許僅僅是字符串的第一個子節點,即不是賦值或其他任何部分的子節點,不應該是unicode。
好問題!
編輯
只是后續評論。 為方便起見, parser.suite
實際上並不會評估你的python代碼。 這意味着您可以在Python文件上運行此解析器,而無需擔心命名或導入錯誤。 例如,假設您包含myObscureUtilityFile.py
from ..obscure.relative.path import whatever
您可以
checkForNonUnicode(open('/whoah/softlink/myObscureUtilityFile.py').read())
您不能強制所有字符串都是Unicode; 即使在模塊中使用from __future__ import unicode_literals
,字節字符串也可以寫成b'...'
,就像在Python 3中一樣。
有可能被用來獲得同樣的效果作為一個選項unicode_literals
全球:命令行選項-U
。 然而它在2.x系列的早期被放棄了,因為它基本上破壞了每個腳本。
你的目的是什么? 廢除字節串是不可取的。 它們不是“壞”,Unicode字符串不是普遍“更好”; 它們是兩個獨立的動物,你需要它們。 當然需要字節字符串來與二進制文件和網絡服務進行通信。
如果你想准備過渡到Python 3,那么最好的辦法就是為你真正想要成為字節的所有字符串寫b'...'
為那些本身就是Unicode的字符串寫u'...'
。 默認字符串'...'
格式可用於其他所有內容,您不關心的位置和/或Python 3是否更改默認字符串類型。
我們的SD源代碼搜索引擎(SCSE)可以直接提供此結果。
SCSE提供了一種使用某種語言結構快速搜索大型文件集的方法,以實現精確查詢並最大限度地減少誤報。 它甚至可以同時處理各種語言,包括Python。 GUI顯示搜索命中和包含所選命中的文件中的實際文本頁面。
它使用來自源語言的詞匯信息作為查詢的基礎,包括各種語言關鍵詞和匹配不同內容語言元素的模式標記。 SCSE知道語言中可用的語法類型。 可以搜索通用標識符(使用查詢標記I)或匹配某些規則表達式的標識符。 類似地,on可以搜索泛型字符串(使用查詢標記“S”表示“任何類型的字符串文字”)或特定類型的字符串(對於Python包括“UnicodeStrings”,非unicode字符串等,它們共同制作包含“S”的Python內容集。
搜索:
'for' ... I=ij*
找到關鍵字'for'near(“...”)一個前綴為“ij”的標識符,並顯示所有匹配。 (忽略包含換行符和注釋的特定於語言的空格。
一個簡單的搜索:
S
找到所有字符串文字。 這通常是一個非常大的集: - }
搜索
UnicodeStrings
查找詞法定義為Unicode字符串的所有字符串文字(u“...”)
你想要的是所有不是UnicodeStrings的字符串。 SCSE提供了一個“減法”運算符,它減去了一種與另一種命中重疊的命中。 所以你的問題,“什么字符串不是unicode”簡明扼要地表達為:
S-UnicodeStrings
顯示的所有匹配將是不是unicode字符串的字符串,這是您的確切問題。
SCSE提供日志記錄功能,以便您可以記錄命中。 您可以從命令行運行SCSE,為您的答案啟用腳本查詢。 將其放入命令腳本將提供一個工具直接給出答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.