使用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
必须是一个
实例变量,因为MyMatcher
的不同实例化
必须匹配不同的东西。
以上示例有效:
mymTrue = MyMatcher(True)
mymFalse = MyMatcher(False)
print (mymTrue.parse("alpha aaaa alpha"))
print (mymFalse.parse("alpha 777 alpha"))
按预期返回:
['alpha', 'aaaa', 'alpha']
['alpha', '777', 'alpha']
我担心的是:这是否适用于非常复杂的有很多匹配的匹配器
(嵌套)a
,b
,c
,d
等等?或者措辞不同:是
从类变量到实例的完整逻辑(深度)复制
对象expr
,因此a
,b
和c
无关紧要
在下一个MyMatcher
对象创建时被覆盖?
或者,如果这是一个问题,是否有另一种方法来创建变化
像(a + b | b ) +
pp.Optional(c)
这样的短而美丽的构造的匹配器?
答案 0 :(得分:2)
变量a
,b
,c
,....是不类变量;它们是__init__
方法中的局部变量。只要需要,对这些变量的引用将保持活动状态。 (参见Python文档Scopes and Namespaces in Classes。)