2016-11-27 4 views
3

いくつかの簡単な文脈では、私はVimテキストエディタを使って、UltiSnipsというプラグインを使用します。私のコードには、このような行があります。ここでは、1行に複数のキーを使用する辞書があります。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"]]) 

私はPythonのASTモジュールを使用して行を処理し、[] Sを捕獲するだけで正規表現である私の現在のシステムからの切り替えを考えていたが、それは私カントーよりも複雑であることが判明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 = ']'、コンテンツ= 'someDict ["something"] [someEmodule.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) 

出力:

0を
関連する問題