带空格的Python方法参数
我想创建一个简单的文件格式/DSL,允许我的用户输入数据。我的系统是python的,使用python的解析器很有吸引力。 这样定义数据元素的语法似乎非常方便带空格的Python方法参数,python,dsl,Python,Dsl,我想创建一个简单的文件格式/DSL,允许我的用户输入数据。我的系统是python的,使用python的解析器很有吸引力。 这样定义数据元素的语法似乎非常方便 Allocation(Param1 = Val1, Param2 = Val2 ) 但是,它不支持带空格的参数名 Allocation(Param 1 = Val1, Param 2 = Val2 ) Python解析器友好的版本可以如下所示,但不是非常用户友好的 Allocation(("Param 1",Val1), ("Param
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更具可读性?您可以这样做:
def Allocation(**kwargs):
print kwargs
myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)
编辑:
您的编辑现在包括我的答案,因此不,没有更简单的方法在关键字参数中使用空格。您可以这样做:
def Allocation(**kwargs):
print kwargs
myargs = {"Param 1":Val1, "Param 2":Val1}
Allocation(**myargs)
编辑:
您的编辑现在包含了我的答案,因此不,没有更简单的方法在关键字参数中使用空格。除非我在这里误解了您的基本前提,否则没有什么可以阻止您编写一个类来解析您自己的自定义语法,然后将该自定义语法用作单个参数字符串:
Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")
在本例中,分号用作名称-值对分隔符,而equals表示名称-值分隔符。此外,您可以轻松地将解析器配置为接受自定义分隔符作为对象构造函数的一部分
如果编写一个解析器似乎太吓人了,考虑一下(对于这样的语法),你可以通过简单地在
上分割字符串来获得你的值。/\s*;\s*/
然后
/\s*=\s*/
以快速获取名称-值对。您还可以选择已经为Python编写的多个参数解析器中的任意一个
诚然,这并没有使用Python作为参数解析器,这是一个需要考虑的问题,您必须在这种方法的简单性与之之间取得平衡。除非我在这里误解了您的基本前提,否则没有什么可以阻止您编写一个解析您自己的自定义语法的类,然后将该自定义语法用作单个参数字符串:
Allocation("Param 1=Check Up; Param 2=Mean Value Theorem;")
在本例中,分号用作名称-值对分隔符,而equals表示名称-值分隔符。此外,您可以轻松地将解析器配置为接受自定义分隔符作为对象构造函数的一部分
如果编写一个解析器似乎太吓人了,考虑一下(对于这样的语法),你可以通过简单地在
上分割字符串来获得你的值。/\s*;\s*/
然后
/\s*=\s*/
以快速获取名称-值对。您还可以选择已经为Python编写的多个参数解析器中的任意一个
诚然,这并没有使用Python作为参数解析器,这是一个需要考虑的问题,您必须在这种方法的简单性之间取得平衡。我想会有办法做到这一点。但我不得不问,在可读性方面,与此真的有足够大的区别吗
Allocation(Param1 = Val1, Param2 = Val2 )
为此:
Allocation(Param 1 = Val1, Param 2 = Val2 )
让事情变得如此不同?我相信有一种方法可以做你想做的事,但我首先关心的是,所付出的努力是否值得
我的目标是提供一个DSL,它可以用于将数据输入到系统中。在上述场景中,参数为人名,值为百分比 我对您现在想要做的事情有了更好的理解,但我仍然认为您可能最终不得不牺牲一些可读性来获得您想要的内容。就我个人而言,我会说:
Allocation(
{ 'name1' : value1,
'name1' : value2, }
)
如果这不是您可以使用的东西,那么您可能需要重新考虑是否要在DSL中使用Python,或者使用国产的东西。对于大多数编程语言来说,允许空白会导致太多的歧义
如果您仍然想使用Python来实现这一点,您可能需要考虑向C-API SIG()发布或可能(作为最后一招)。我能看到的唯一方法是将python解释器嵌入到C/C++程序中,并对其进行某种黑客攻击(这可能很难!)。
我想会有办法做到这一点。但我不得不问,在可读性方面,与此真的有足够大的区别吗Allocation(Param1 = Val1, Param2 = Val2 )
为此:
Allocation(Param 1 = Val1, Param 2 = Val2 )
让事情变得如此不同?我相信有一种方法可以做你想做的事,但我首先关心的是,所付出的努力是否值得
我的目标是提供一个DSL,它可以用于将数据输入到系统中。在上述场景中,参数为人名,值为百分比 我对您现在想要做的事情有了更好的理解,但我仍然认为您可能最终不得不牺牲一些可读性来获得您想要的内容。就我个人而言,我会说:
Allocation(
{ 'name1' : value1,
'name1' : value2, }
)
如果这不是您可以使用的东西,那么您可能需要重新考虑是否要在DSL中使用Python,或者使用国产的东西。对于大多数编程语言来说,允许空白会导致太多的歧义
如果您仍然想使用Python来实现这一点,您可能需要考虑向C-API SIG()发布或可能(作为最后一招)。我所能看到的唯一方法是将python解释器嵌入到C/C++程序中,并对其进行某种黑客攻击(这可能很难!)。
以下是我的首选AllocationSet(
Alloc( name="some name", value=1.23 ),
Alloc( name="another name", value=2.34 ),
Alloc( name="yet another name", value=4.56 ),
)
这些是相对容易创建的类声明。生成的结构也易于处理。以下是我的偏好
AllocationSet(
Alloc( name="some name", value=1.23 ),
Alloc( name="another name", value=2.34 ),
Alloc( name="yet another name", value=4.56 ),
)
这些是相对容易创建的类声明。生成的结构也很容易处理。+1:带空格的参数名称不值得费劲,也没有真正的帮助。使用u而不是空格。我的目标是提供一个DSL,该DSL可用于将数据输入系统。在上面的场景中,参数是人名,值是百分比。每人分配一次(name=“some person”,value=3.2)有什么不对?是的,我想我会这样做。但是似乎有点太冗长了。+1:param名称加空格不值得这么痛苦,也没有真正的帮助。使用