2016-11-27 61 views
3

在一些快速上下文中,我使用Vim文本編輯器,並使用它作爲一個名爲UltiSnips的插件。我有時在我的代碼中有這樣一行,我有一個字典,它在一行中使用多個鍵。將一行Python代碼劃分爲幾部分

someDict["something"]["anotherThing"] 

如果這一行得到一個KeyError,我選擇該行並使用UltiSnips插件將其轉換爲它的部分。

print(someDict) 
print(someDict["something"]) 
print(someDict["something"]["anotherThing"]) 

它非常適合於簡單的目的,但我想這是一個有點聰明,因爲在目前,我無法處理任何事情更加複雜,這樣

someDict["something"][some_module.someOtherDict["somethingElse"]] 

(預期輸出)

print(someDict) 
print(someDict["something"]) 
print(some_module) 
print(some_module.someOtherDict) 
print(some_module.someOtherDict["somethingElse"]) 
print(someDict["something"][some_module.someOtherDict["somethingElse"]]) 

我想從我的當前系統,這僅僅是正則表達式,其捕獲[] S,以處理使用Python的AST模塊線路切換,但它被證明是更復雜的比我壽因爲ast從我預期的方式向後評估。我在寫信詢問是否已經有這樣的事情存在,或者是解決這個問題的更好方法。

設置來測試與解決方案(頂線輸入,打印線是預期的輸出)的樣本:

something 
print(something) 

something.anotherThing 
print(something) 
print(something.anotherThing) 

something.anotherThing() 
print(something) 
print(something.anotherThing) 
print(something.anotherThing()) 

something.anotherThing()['aDictKey'].moreMethods(valueInfo, 8, 'methodString', someKeyword=value, *args, **kwargs) 
print(something) 
print(something.anotherThing) 
print(something.anotherThing()) 
print('aDictKey') 
print(something.anotherThing()['aDictKey']) 
print(something.anotherThing()['aDictKey'].moreMethods) 
print(valueInfo) 
print(8) 
print('methodStrings') 
print(value) 
print(*args) 
print(**kwargs) 
print(valueInfo, 8, 'methodString', someKeyword=value, *args, **kwargs) 
print(something.anotherThing()['aDictKey'].moreMethods(valueInfo, 8, 'methodString', someKeyword=value, *args, **kwargs)) 

something.anotherThing()[(someObj.someDict['itsKey'], 8, True)].moreMethods() 
print(something) 
print(something.anotherThing) 
print(something.anotherThing()) 
print(someObj) 
print(someObj.someDict) 
print('itsKey') 
print(someObj.someDict['itsKey']) 
print(8) 
print(True) 
print(something.anotherThing()[someObj.someDict['itsKey']]) 
print(something.anotherThing()[someObj.someDict['itsKey']].moreMethods) 
print(something.anotherThing()[someObj.someDict['itsKey']].moreMethods()) 

我後來會後我自己的解決方案時,我有更多的時間去努力這

+4

你可以看看'pyparsing'。例如:'import pyparsing ne = pyparsing.nestedExpr(opener ='[',closer =']',content ='someDict [「something」] [some_module.someOtherDict [「somethingElse」]]')' –

+0

從未聽說過直到你提到它爲止。這看起來非常有用,謝謝分享! – ColinKennedy

回答

1

下面是使用ASTTokens一個解決方案:

import ast, asttokens 

def expand(line): 
    atok = asttokens.ASTTokens(line, parse=True) 
    return [atok.get_text(n) for n in ast.walk(atok.tree) 
      if isinstance(n, ast.expr) and not isinstance(n, (ast.Num, ast.Str))] 

for expr in reversed(expand('someDict["something"][some_module.someOtherDict["somethingElse"]]')): 
    print("print(%s)" % expr) 

輸出:

print(some_module) 
print(some_module.someOtherDict) 
print(some_module.someOtherDict["somethingElse"]) 
print(someDict) 
print(someDict["something"]) 
print(someDict["something"][some_module.someOtherDict["somethingElse"]])