Open tonal opened 1 year ago
Можно так
Inn = fact(
'INN', ['value'])
class IpInn(Inn):
type = 'ip'
class OooInn(Inn):
type = 'ooo'
...
INN12 = ....interpretation(IpInn)
INN10 = ....interpretation(OooInn)
В этом случае после разбора тип факта будет <class 'yargy.interpretation.fact.INN'> и значение не будет содержать доп. атрибутов:
INN = rule(
rule('ИНН'), or_(INN12, INN10),
).interpretation(Inn)
def main_test():
from yargy import Parser
txt = 'ИНН 7707083893'
parser = Parser(INN)
for match in parser.findall(txt):
fact = match.fact
print(type(fact), fact)
Выдача:
<class 'yargy.interpretation.fact.INN'> INN(value=7707083893)
Т. е. получается, что экземпляры фактов не переносятся, а каждый раз конструируются заново из набора изменённых атрибутов.
В этом случае после разбора тип факта будет <class 'yargy.interpretation.fact.INN'> и значение не будет содержать доп. атрибутов:
class IpInn(fact('IpInn', ['value'])):
type = 'ip'
class OooInn(fact('OooInn', ['value'])):
type = 'ooo'
INN = rule(
rule('ИНН'), or_(INN12, INN10),
).interpretation(Inn) # < Вот здесь какой факт указывать?
Если указать общий предок - в нём не будет поля type. Если добавить атрибут - он не заполнится из дочерних.
Proxy = fact('Proxy', ['value'])
INN = rule(
rule('ИНН'), or_(
INN12.interpretation(IpInn),
INN10.interpretation(OooInn)
).interpretation(Proxy.value),
).interpretation(Proxy)
Пример - правило для ИНН Для физ.лиц - 12 цифр, для юр.лиц - 10
Хочется в конкретном правиле не только запомнить цифры, но и установить флаг - физ.лицо или юр.лицо