1

我想创建一个简单的文件格式/DSL,它允许我的用户输入数据。我的系统在 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 中更具可读性?

4

4 回答 4

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 列表(作为最后的手段)。我能看到的唯一方法是将 python 解释器嵌入到 C/C++ 程序中并对其进行某种黑客攻击(这可能很困难!)。

于 2008-12-09T04:42:47.137 回答
1

你可以这样做:

def Allocation(**kwargs):
    print kwargs

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

编辑: 您的编辑现在包括我的答案,所以不,没有更简单的方法可以在关键字参数中包含空格。

于 2008-12-09T04:22:03.577 回答
1

除非我在这里误解了您的基本前提,否则没有什么可以阻止您编写一个解析您自己的自定义语法的类,然后将该自定义语法用作单参数字符串:

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

在此示例中,分号充当名称-值-对分隔符,等号表示名称-值分隔符。此外,您可以轻松地将解析器配置为接受自定义分隔符作为对象构造函数的一部分。

如果编写解析器似乎太令人生畏,请考虑(对于这样的语法)您可以通过简单地将字符串拆分来获取您的值

/\s*;\s*/

然后继续

/\s*=\s*/

快速获取名称-值对。您还可以从已经为 Python 编写的多个参数解析器中进行选择。

诚然,这并没有使用 Python 作为参数解析器,这是您必须权衡的一个考虑因素,例如这种方法的简单性。

于 2008-12-09T04:40:19.780 回答
1

这是我的偏好。

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

这些是相对容易创建的类声明。由此产生的结构也易于加工。

于 2008-12-09T16:36:00.380 回答