1

我正在編寫一個基於外部文件生成另一個python腳本的python腳本。我的代碼的一小部分可以在下面看到。我沒有接觸過這類腳本的很多例子,所以我想知道最佳實踐是什麼。Python中文本生成的最佳實踐

正如代碼示例的最後兩行所示,我使用的技術有時可能很笨重。

SIG_DICT_NAME = "sig_dict" 

SIG_LEN_KEYWORD = "len" 
SIG_BUS_IND_KEYWORD = "ind" 
SIG_EP_ADDR_KEYWORD = "ep_addr" 

KEYWORD_DEC = "{} = \"{}\"" 

SIG_LEN_KEYWORD_DEC = KEYWORD_DEC.format(SIG_LEN_KEYWORD, SIG_LEN_KEYWORD) 
SIG_BUS_IND_KEYWORD_DEC = KEYWORD_DEC.format(SIG_BUS_IND_KEYWORD, 
              SIG_BUS_IND_KEYWORD) 
SIG_EP_ADDR_KEYWORD_DEC = KEYWORD_DEC.format(SIG_EP_ADDR_KEYWORD, 
              SIG_EP_ADDR_KEYWORD) 

SIG_DICT_DEC = "{} = dict()" 
SIG_DICT_BODY_LINE = "{}[{}.{}] = {{{}:{}, {}:{}, {}:{}}}" 

#line1 = SIG_DICT_DEC.format(SIG_DICT_NAME) 
#line2 = SIG_DICT_BODY.format(SIG_DICT_NAME, x, y, z...) 
+0

我很好奇 - 要做什麼,你試圖解決什麼問題,也就是說,你試圖生成的代碼是什麼? – 2015-02-07 18:32:09

+0

最好的做法是使用更多結構化的不太神奇的方法,例如[函數,類,'hasattr' /'getattr',metaclasses](https://github.com/lihaoyi/macropy#levels-of-magic)* *您考慮文本生成。 – jfs 2015-02-07 18:41:45

+0

@HughBothwell外部文件是一些數據信號的列表,這些數字信號存在於特定索引的某些總線上。該文件遵守一些約束條件(如最大索引或最大總線地址),但是信號的名稱,它們的總線和它們的索引可能會改變。 我希望能夠生成可以解析外部文件的Python,並創建一個將信號名稱映射到其屬性(總線,索引,以及其他任何東西)的字典,併爲每個信號寫入函數來設置或讀取信號。 – jwp36 2015-02-07 18:41:47

回答

0

您似乎在翻譯關鍵字。

將每個「句子」讀入代表性的Python類幾乎肯定會更好;然後你可以直接運行模擬,或者讓每個類自己寫一個「輸出句子」。

正確完成,這應該是更容易編寫和調試,併產生更多的慣用輸出。

1

你真的沒有看到這種事情的例子,因爲你的解決方案可能是一丁點兒的過度設計;)

我猜你想收集一些「東西狀態」 ,然後你想運行一個腳本來處理這個「狀態」。寫一個meta-script,而不是寫一個meta-script,通常更方便的是編寫一個腳本來完成處理(比如process.py),另一個腳本可以收集「狀態」(比如collect.py) 。

然後你可以從collect.py採取的結果,並在process.py把他們寫出來todays_results.txt或一些這樣的: collect.py - >process.py - >20150207_results.txt

如果需要的話,你可以像寫中間文件到硬盤:

with open('todays_progress.txt') as f_out: 
    for thing, state in states_of_things.iteritems(): 
     f.write('{}<^_^>{}\n'.format(state, thing)) 

然後你就可以用類似解析它放回後

比扁平字典更復雜的數據結構?那麼,這是Python。可能有不止一個模塊!如果你需要一些更詳細的結構,我會建議json如果明文會做,或者pickle。使用pickle的兩個警告:自定義對象並不總是被重新實例化,並且易受代碼注入攻擊的影響,所以只有在整個工作流程可信時才使用它。

希望這會有所幫助!