簡體   English   中英

Python 2.x:如何自動執行unicode而不是字符串?

[英]Python 2.x: how to automate enforcing unicode instead of string?

如何自動執行測試以強制Python 2.x代碼的主體不包含字符串實例(僅限unicode實例)?

例如。

我可以在代碼中執行此操作嗎?

是否有具有此功能的靜態分析工具?

編輯:

我想在Python 2.5中使用這個應用程序,但事實證明這不可能,因為:

  1. 2.5不支持unicode_literals
  2. kwargs字典鍵不能是unicode對象,只能是字符串

所以我接受了答案,說這是不可能的,即使它是由於不同的原因:)

在我看來,你真的需要用一個誠實的善良的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM