python - pyparsing - 如何解析包含元组的函数?
python - pyparsing - How to parse functions containing tuples?
所以我正在制作一个解析器,但该程序不解析以元组作为参数的函数。例如,当我使用定义如下的 dist
函数时:
def dist(p, q):
"""Returns the Euclidean distance between two points p and q, each given as a sequence (or iterable) of coordinates. The two points must have the same dimension."""
if not isinstance(p, tuple):
p = p,
if not isinstance(q, tuple):
q = q,
if not p or not q:
raise TypeError
if len(p)!=len(q):
raise ValueError
return math.sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
结果如下:
>> evaluate("dist(5, 2)")
3
>> evaluate("dist((5, 2), (3, 4))")
SyntaxError: Expected end of text, found '(' (at char 4), (line:1, col:5)
如何修改解析器以接受元组函数参数,以便 evaluate("dist((5, 2), (3, 4))")
returns 2.8284271247461903
?
如果您想在 python 中传递可变数量的参数,则需要使用 args
关键字。 This 问题解释了如何做到这一点,但我将从这里的答案中复制代码:
print "I was called with", len(arg), "arguments:", arg
>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2,3)
I was called with 3 arguments: (1, 2, 3)
这是此问题和所有未来 "how do I add Feature X to my parser?" 问题的答案:
- 为功能 X 编写 pyparsing 表达式。
- 使用 运行Tests().
为功能 X 编写一些测试字符串并确保它们有效
- 找出它适合 NumericStringParser 的位置。提示:寻找相似物品的使用地点和位置。
- 使用功能 X 编写更多的整体字符串测试。
- 将功能 X 插入解析器并 运行 您的测试。确保您以前的所有测试也仍然通过。
如果这个问题对您来说太具有挑战性,那么您需要学习的不仅仅是从 Google 中复制粘贴代码。 Whosebug 用于回答具体问题,而不是广泛的问题,这些问题实际上是 CS 学期课程的主题。
所以我正在制作一个解析器,但该程序不解析以元组作为参数的函数。例如,当我使用定义如下的 dist
函数时:
def dist(p, q):
"""Returns the Euclidean distance between two points p and q, each given as a sequence (or iterable) of coordinates. The two points must have the same dimension."""
if not isinstance(p, tuple):
p = p,
if not isinstance(q, tuple):
q = q,
if not p or not q:
raise TypeError
if len(p)!=len(q):
raise ValueError
return math.sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
结果如下:
>> evaluate("dist(5, 2)")
3
>> evaluate("dist((5, 2), (3, 4))")
SyntaxError: Expected end of text, found '(' (at char 4), (line:1, col:5)
如何修改解析器以接受元组函数参数,以便 evaluate("dist((5, 2), (3, 4))")
returns 2.8284271247461903
?
如果您想在 python 中传递可变数量的参数,则需要使用 args
关键字。 This 问题解释了如何做到这一点,但我将从这里的答案中复制代码:
print "I was called with", len(arg), "arguments:", arg
>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2,3)
I was called with 3 arguments: (1, 2, 3)
这是此问题和所有未来 "how do I add Feature X to my parser?" 问题的答案:
- 为功能 X 编写 pyparsing 表达式。
- 使用 运行Tests(). 为功能 X 编写一些测试字符串并确保它们有效
- 找出它适合 NumericStringParser 的位置。提示:寻找相似物品的使用地点和位置。
- 使用功能 X 编写更多的整体字符串测试。
- 将功能 X 插入解析器并 运行 您的测试。确保您以前的所有测试也仍然通过。
如果这个问题对您来说太具有挑战性,那么您需要学习的不仅仅是从 Google 中复制粘贴代码。 Whosebug 用于回答具体问题,而不是广泛的问题,这些问题实际上是 CS 学期课程的主题。