2011-10-06 39 views
1

我有一個庫可以做一些「翻譯」,並使用真棒tokenize.generate_tokens()函數來實現。高效,乾淨的在Python中增長分詞器功能的方法

而且速度非常快,而且我的工作正常。但是在翻譯時,我發現功能不斷增長,我想翻譯新的令牌,並且ifelif條件開始全部流行。我還在發生器外部保留了一些跟蹤「最後看到的關鍵字」和類似內容的變量。

的一個很好的例子是實際的Python文檔一個在這裏看到(底部):http://docs.python.org/library/tokenize.html#tokenize.untokenize

每次我加我需要把這種功能的新東西長几個條件句。我不認爲具有這麼多條件的函數是爲鋪平道路鋪路的正確途徑。

此外,我覺得tokenizer會消耗很多不相關的行,而這些行不包含任何我正在翻譯的關鍵字。

所以2個問題:

  1. 我怎樣才能避免增加更多的條件語句,這將使這個翻譯功能便於/清潔,以保持增長(沒有性能損失)?

  2. 我該如何使它對我不感興趣的所有不相關的行都有效?

+0

我不確定我是否理解你的問題,但其中的一部分似乎是你想避免一個長的if-elif-elif鏈。如果你測試的是相等的常數,你可以將它們存儲在字典中:'switch = {'FOO':somefunc,...}'。然後'切換''FOO'](參數)'。 –

回答

3

您可以使用字典調度程序。例如,你的代碼鏈接到可能是這樣的:

def process_number(result,tokval): 
    if '.' in tokval: 
     result.extend([ 
      (NAME, 'Decimal'), 
      (OP, '('), 
      (STRING, repr(tokval)), 
      (OP, ')') 
      ]) 
def process_default(result,tokval): 
    result.append((toknum, tokval)) 

dispatcher={NUMBER: process_number, } 
for toknum, tokval, _, _, _ in g: 
    dispatcher.get(toknum,process_default)(result,tokval) 

而是加入了更多if -blocks的,您可以添加鍵值對,以dispatcher

這可能比評估一長串if-else條件更有效,因爲字典查找是O(1),但它確實需要函數調用。您必須進行基準測試,以瞭解它與許多if-else塊的對比情況。

我認爲它的主要優點是它可以將代碼組織在小的(可)可理解的單元中。

+0

謝謝,這就是我一直在尋找的! – alfredodeza

相關問題