2008-12-09 25 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