我想创建一个简单的文件格式/ 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中更具可读性?
答案 0 :(得分:3)
我想有一些方法可以做到这一点。但是我觉得有必要问一下,这个
的可读性真的有很大差异吗?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)或python-dev list(作为最后的手段)。我能看到这样做的唯一方法是将python解释器嵌入到C / C ++程序中并用它进行某种黑客攻击(这可能很困难!)。
答案 1 :(得分:1)
除非我在这里误解了你的基本前提,否则没有什么可以阻止你编写一个解析你自己的自定义语法的类,然后将该自定义语法用作单参数字符串:
Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")
在此示例中,分号充当名称 - 值对分隔符,而equals表示名称 - 值分隔符。此外,您可以轻松地将解析器配置为接受自定义分隔符作为对象构造函数的一部分。
如果编写解析器似乎太令人生畏,那么考虑一下(对于这样的语法),你可以通过简单地分割字符串来获取你的值
/\s*;\s*/
然后
/\s*=\s*/
快速获取名称 - 值对。您还可以选择已经为Python编写的几个参数解析器中的任何一个。
不可否认,这并不使用Python作为参数解析器,这是一个考虑因素,你必须平衡这种方法的简单性。
答案 2 :(得分:1)
这是我的偏好。
AllocationSet(
Alloc( name="some name", value=1.23 ),
Alloc( name="another name", value=2.34 ),
Alloc( name="yet another name", value=4.56 ),
)
这些是相对容易创建的类声明。由此产生的结构也很愉快。
答案 3 :(得分:0)
你可以这样做:
def Allocation(**kwargs):
print kwargs
myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)
修改强> 您的编辑现在包含我的答案,所以不,没有更简单的方法在关键字参数中包含空格。