2016-04-20 22 views
0

私は別のPythonファイルをコンパイルするためにPythonを使用しています。この目的を達成するために、私は上記の出力は適切な複数行インデントでPythonコードを生成するためのPythonテンプレート

def main(): 
    a 
b 
c 
    return 

れ、すでにハイライトである

from string import Template 

s = Template(''' 
def main(): 
    ${body} 
    return 
''') 


# body constructed bit by bit 
body = ['a'] 
body.append('b') 
body.append('c') 

out = s.substitute(body='\n'.join(body)) 

print(out) 

、私は例えば、構築関数本体、例えば、挿入先のstringからTemplateを使用します問題:${body}最初の行以外の行は正しくインデントされません。もちろん、'b''c'bodyのリストに挿入するときにスペースを手動で追加することはできますが、すでにボディが挿入されるテンプレートの知識を前提としています。

は(おそらくstring.Templateを開始する適切なテンプレートエンジンではないです。)

+1

'私は= s.template.find( '$ {body}'); indent = s.template [s.template.rfind( '\ n'、0、i)+ 1:i];インデントレベルが異なる複数の '$ {body} 'がある場合、out = s.substitute(body =(' \ n '+ indent).join(body))'は動作しません。 – falsetru

+0

あなたの要求が正確であると言うべきです。適切なインデントを持つ行のリストを挿入することは可能であるべきですが、 'string.Template'が作られたのとまったく同じではありません。 –

+0

コメントありがとうございます。説明から不明な点は何ですか?私はそれにもっと詳細を加えようとします。 –

答えて

1

${}モデルはインデントを除いて(行の先頭にある場合にのみ、あなたは複数回線交換のためのインデントを修正する必要があると仮定すると、 )、正規表現を使用してマスク内のすべてのトークンを見つけることができます。また、空白だけが先行する場合は、置換リストの次のすべての行でそれらを繰り返します。

あなたはそのようなコードを使用することができます

import string, re 
def substitute(s, reps): 
    t = string.Template(s) 
    i=0; cr = {} # prepare to iterate through the pattern string 
    while True: 
     # search for next replaceable token and its prefix 
     m =re.search(r'^(.*?)\$\{(.*?)\}', tpl[i:], re.MULTILINE) 
     if m is None: break # no more : finished 
     # the list is joined using the prefix if it contains only blanks 
     sep = ('\n' + m.group(1)) if m.group(1).strip() == '' else '\n' 
     cr[m.group(2)] = sep.join(rep[m.group(2)]) 
     i += m.end() # continue past last processed replaceable token 
    return t.substitute(cr) # we can now substitute 

あなたの例では(わずかに変更された)、それは与えるだろう:予想通り

s = ''' 
def main(): 
    ${body} 
    return ${retval} 
''') 
# body constructed bit by bit 
body = ['a'] 
body.append('b') 
body.append('c') 

out = substitute(s, { 'body': body, 'retval': 0 } 
print (out) 

をそれは与える:

def main(): 
    a 
    b 
    c 
    return 0 
関連する問題