Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Как установить несколько атрибутов факта? #86

Open
tonal opened this issue Jul 31, 2023 · 6 comments

Comments

@tonal
Copy link

tonal commented Jul 31, 2023

Пример - правило для ИНН
Для физ.лиц - 12 цифр, для юр.лиц - 10

Хочется в конкретном правиле не только запомнить цифры, но и установить флаг - физ.лицо или юр.лицо

from yargy import and_, or_, rule
from yargy.interpretation import fact
from yargy.predicates import gte, length_eq, lte

Inn = fact(
  'INN', ['value', 'is_phis'])

INN12 = rule(
  and_(
    gte(0), lte(999999999999), length_eq(12)
  ).interpretation(Inn.value.custom(int)), #.interpretation(Inn.is_phis.const(True))
).interpretation(Inn)


INN10 = rule(
  and_(
    gte(0), lte(9999999999), length_eq(10)
  ).interpretation(Inn.value.custom(int)), #.interpretation(Inn.is_phis.const(False))
).interpretation(Inn)


INN = rule(
  rule('ИНН'), or_(INN12, INN10),
).interpretation(Inn)
@kuk
Copy link
Member

kuk commented Aug 1, 2023

Можно так

Inn = fact(
  'INN', ['value'])


class IpInn(Inn):
  type = 'ip'


class OooInn(Inn):
  type = 'ooo'

...

INN12 = ....interpretation(IpInn)
INN10 = ....interpretation(OooInn)


@tonal
Copy link
Author

tonal commented Aug 3, 2023

В этом случае после разбора тип факта будет <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)

@tonal
Copy link
Author

tonal commented Aug 3, 2023

Т. е. получается, что экземпляры фактов не переносятся, а каждый раз конструируются заново из набора изменённых атрибутов.

@kuk
Copy link
Member

kuk commented Aug 9, 2023

В этом случае после разбора тип факта будет <class 'yargy.interpretation.fact.INN'> и значение не будет содержать доп. атрибутов:


class IpInn(fact('IpInn', ['value'])):
  type = 'ip'


class OooInn(fact('OooInn', ['value'])):
  type = 'ooo'

@tonal
Copy link
Author

tonal commented Aug 12, 2023

INN = rule(
  rule('ИНН'), or_(INN12, INN10),
).interpretation(Inn) # < Вот здесь какой факт указывать?

Если указать общий предок - в нём не будет поля type.
Если добавить атрибут - он не заполнится из дочерних.

@kuk
Copy link
Member

kuk commented Aug 21, 2023

Proxy = fact('Proxy', ['value'])

INN = rule(
  rule('ИНН'), or_(
    INN12.interpretation(IpInn),
    INN10.interpretation(OooInn)
  ).interpretation(Proxy.value),
).interpretation(Proxy)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants