2008-12-09 55 views
1

我想創建一個簡單的文件格式/ DSL,這將允許我的用戶輸入數據。我的系統是在Python中,使用Python的解析器很吸引人。 用於定義數據元素的語法似乎非常方便。Python方法參數與空格

Allocation(Param1 = Val1, Param2 = Val2) 

但是,它不支持帶空格的參數名。

Allocation(Param 1 = Val1, Param 2 = Val2) 

Python解析器友好版本可以看起來如下,但不是非常用戶友好。

Allocation(("Param 1",Val1), ("Param 2",Val1)) 
Allocation(**{"Param 1":Val1, "Param 2":Val1}) 

有沒有辦法讓這在python中更具可讀性?

回答

1

這是我的偏好。

AllocationSet(
    Alloc(name="some name", value=1.23), 
    Alloc(name="another name", value=2.34), 
    Alloc(name="yet another name", value=4.56), 
) 

這些是相對容易的類創建聲明。由此產生的結構也令人愉快。

0

你可以這樣做:

def Allocation(**kwargs): 
    print kwargs 

myargs = {"Param 1":Val1, "Param 2":Val1} 
Allocation(**myargs) 

編輯: 您編輯現在包括我的回答所以沒有,也沒有有在關鍵字參數空間更簡單的方法。

1

除非我弄錯這裏你的基本前提,沒有什麼可以從編寫,它分析你自己的自定義語法類,然後使用自定義的語法爲單參數字符串阻止你:

Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;") 

在在這個例子中,分號用作名稱 - 值對分隔符,而equals表示名稱 - 值分隔符。此外,您可以輕鬆地將您的解析器配置爲接受自定義分隔符作爲對象構造函數的一部分。

如果它似乎過於艱鉅寫一個解析器,考慮(對語法像這樣),你可以通過簡單地分割字符串上

/\s*;\s*/ 

,然後

/\s*=\s*/ 
獲得你的價值觀

快速獲取名稱 - 值對。您也可以選擇已經爲Python編寫的幾個參數解析器中的任何一個。

不可否認,這並不使用Python作爲參數解析器,這是一個考慮因素,您將不得不平衡這種方法的簡單性。

3

我想象會有一些方法可以做到這一點。但是,我不得不問,是真的在可讀性有較大的差異足以從這個

Allocation(Param1 = Val1, Param2 = Val2) 

要這樣:

Allocation(Param 1 = Val1, Param 2 = Val2) 

做出這麼大的區別呢?我相信有一種方法可以做你想做的事情,但我首先關心的是如果所做的努力是值得的。

我的目標是提供一個可用於數據錄入系統的DSL。在上面的情景中,參數是人名,值是百分比。

我對你現在要做的事情有了更好的理解,但我仍然認爲你可能最終不得不犧牲一些可讀性來得到你想要的。就個人而言,我喜歡的東西去:

Allocation(
    { 'name1' : value1, 
     'name1' : value2, } 
) 

如果這不是你可以一起去,那麼你可能要重新考慮是否要使用Python爲你的DSL或與一些本土去。允許空白字符允許大多數編程語言使用太多含糊不清的字符。

如果你仍然想用python來追求這個,你可能要考慮發佈到C-API SIG(SIGS)或者python-dev list(作爲最後的手段)。我能看到這樣做的唯一方法是將python解釋器嵌入到C/C++程序中,並使用它進行某種黑客攻擊(這可能很困難!)。

+0

+1:帶空格的參數名稱不值得痛苦,並沒有真正的幫助。使用_而不是空格。 – 2008-12-09 12:43:25