从 class 个变量元素构造实例变量 pyparsing 匹配器
Constructing a instance variable pyparsing matcher from class variable elements
用pyparsing
我构建了一个
假设匹配略有不同的复杂匹配器对象
事情取决于实例化标志。这里有一个(简化的)例子:
class MyMatcher():
def __init__( self, special_flag = False):
self.special_flag = special_flag
a = pp.Word(pp.alphas)('A')
if self.special_flag:
b = pp.Word(pp.alphas)('B')
else:
b = pp.Word(pp.nums)('B')
c = pp.Word(pp.alphas)('C')
# d = ...
# e = ...
# ...
self.expr = (a + b | b ) + pp.Optional(c) # + ...
def parse(self, s):
return self.expr.parseString(s, parseAll=True)
a
,b
,c
,....都是class变量,方便我参考他们
在 expr
中就像那样,不必在它们前面加上前缀
实例参考 self
(如 self.a
)。 expr
必须是
instance 变量,因为 MyMatcher
的不同实例化
必须匹配不同的东西。
以上示例有效:
mymTrue = MyMatcher(True)
mymFalse = MyMatcher(False)
print (mymTrue.parse("alpha aaaa alpha"))
print (mymFalse.parse("alpha 777 alpha"))
returns 符合预期:
['alpha', 'aaaa', 'alpha']
['alpha', '777', 'alpha']
我担心的是:这是否适用于非常复杂的匹配器
(嵌套)a
、b
、c
、d
等...?或者换个说法:是
完整逻辑 (deep-)copied 从 class 变量到实例
对象 expr
,因此 a
、b
和 c
无关紧要
在下一个 MyMatcher
对象创建时被覆盖?
或者如果这是一个问题,是否有另一种方法来创建不同的
像 (a + b | b ) +
pp.Optional(c)
?
这样短而漂亮的匹配器
变量a
、b
、c
、...是不是 class变量;它们是 __init__
方法中的局部变量。只要需要,对这些变量的引用就会一直存在。 (请参阅 Python 文档 Scopes and Namespaces in Classes。)
用pyparsing
我构建了一个
假设匹配略有不同的复杂匹配器对象
事情取决于实例化标志。这里有一个(简化的)例子:
class MyMatcher():
def __init__( self, special_flag = False):
self.special_flag = special_flag
a = pp.Word(pp.alphas)('A')
if self.special_flag:
b = pp.Word(pp.alphas)('B')
else:
b = pp.Word(pp.nums)('B')
c = pp.Word(pp.alphas)('C')
# d = ...
# e = ...
# ...
self.expr = (a + b | b ) + pp.Optional(c) # + ...
def parse(self, s):
return self.expr.parseString(s, parseAll=True)
a
,b
,c
,....都是class变量,方便我参考他们
在 expr
中就像那样,不必在它们前面加上前缀
实例参考 self
(如 self.a
)。 expr
必须是
instance 变量,因为 MyMatcher
的不同实例化
必须匹配不同的东西。
以上示例有效:
mymTrue = MyMatcher(True)
mymFalse = MyMatcher(False)
print (mymTrue.parse("alpha aaaa alpha"))
print (mymFalse.parse("alpha 777 alpha"))
returns 符合预期:
['alpha', 'aaaa', 'alpha']
['alpha', '777', 'alpha']
我担心的是:这是否适用于非常复杂的匹配器
(嵌套)a
、b
、c
、d
等...?或者换个说法:是
完整逻辑 (deep-)copied 从 class 变量到实例
对象 expr
,因此 a
、b
和 c
无关紧要
在下一个 MyMatcher
对象创建时被覆盖?
或者如果这是一个问题,是否有另一种方法来创建不同的
像 (a + b | b ) +
pp.Optional(c)
?
变量a
、b
、c
、...是不是 class变量;它们是 __init__
方法中的局部变量。只要需要,对这些变量的引用就会一直存在。 (请参阅 Python 文档 Scopes and Namespaces in Classes。)