题
我想创建一个简单的文件格式/ DSL这将允许我的用户输入数据。我的系统是在Python和使用python的解析器吸引力。 语法这样定义的数据元素似乎很方便。
Allocation(Param1 = Val1, Param2 = Val2 )
然而,它不支持PARAM名称为空格。
Allocation(Param 1 = Val1, Param 2 = Val2 )
Python的解析器友好的版本可以看看如下,但不是很人性化。
Allocation(("Param 1",Val1), ("Param 2",Val1) )
Allocation(**{"Param 1":Val1, "Param 2":Val1} )
是否有一种方法,使这个在python更易读?
解决方案
下面是我的偏好。
AllocationSet(
Alloc( name="some name", value=1.23 ),
Alloc( name="another name", value=2.34 ),
Alloc( name="yet another name", value=4.56 ),
)
这些是相对容易类声明来创建。所得到的结构是愉快的过程中,也
其他提示
我想像会有一些方法来做到这一点。但是,我不得不问,是真的有可读性从这个足够大的差异
Allocation(Param1 = Val1, Param2 = Val2 )
要这样:
Allocation(Param 1 = Val1, Param 2 = Val2 )
做这么大的区别呢?我敢肯定有办法做你想做的事,但我首先关注的是,如果所付出的努力是值得的结果。
我的目标是提供一种可用于将数据输入到系统中的DSL。在上述情况下,则params将是人的名称和值将是百分比。
我有一个更好的了解你现在想做什么,但我仍然认为,你可能最终不得不牺牲一些可读性得到你想要的东西。就个人而言,我会去的东西,如:
Allocation(
{ 'name1' : value1,
'name1' : value2, }
)
如果这不是你可以一起去,那么你可能要重新考虑是否要使用Python为你的DSL或与一些本土去。允许空白允许太多的歧义对于大多数编程语言允许它。
如果你仍然想使用Python来追求这个,你可能要考虑张贴到C-API SIG(的 SIGS )或也许蟒-dev的列表一>(作为最后的手段)。我可以看到这样做的唯一方法是嵌入Python解释成C / C ++程序,并做一些与它黑客攻击(这是很困难的!)的。
除非我在这里你误认为基本前提,没有什么可以从编写解析自己的自定义语法类,然后使用自定义的语法为单参数字符串阻止你:
Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")
在这个例子中,分号充当名称 - 值对分离器,并且等于代表名称 - 值隔板。此外,你可以轻松地配置您的解析器接受定制的分隔符为对象构造的一部分。
如果它似乎过于艰巨写一个解析器,考虑(对语法像这样),你可以通过简单地分割上
字符串获得你的价值观/\s*;\s*/
,然后在
/\s*=\s*/
快速获取的名称 - 值对。您也可以从任何已经为Python编写的几个参数解析器选择的选项。
诚然,这不使用Python作为参数分析器,它是一个考虑因素,你将不得不针对方法的简单性平衡如此。
您可以这样做:
def Allocation(**kwargs):
print kwargs
myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)
修改强> 您现在的编辑包括我的回答所以没有,也没有有在关键字参数空间中更容易的方法。