Невозможно получить доступ к переменным предыдущих шаблонов в TTP (синтаксический анализатор текста шаблона) python

#python-3.x #network-programming #text-parsing

Вопрос:

Проходя через ttp (анализатор текста шаблона), я наткнулся на функцию поиска в переменных и группах соответствия. Там упоминается, что мы можем использовать поиск по предыдущим переменным шаблона, но даже пример кода не даст надлежащих результатов в моем компиляторе.

 from ttp import ttp  template = ''' lt;template name="interfaces"gt; lt;input load="text"gt; interface FastEthernet2.13  description Customer CPE interface  ip address 10.12.13.1 255.255.255.0  vrf forwarding CPE-VRF ! interface GigabitEthernet2.13  description Customer CPE interface  ip address 10.12.14.1 255.255.255.0  vrf forwarding CUST1 ! lt;/inputgt;  lt;group name="{{ interface }}"gt; interface {{ interface }}  description {{ description | ORPHRASE }}  ip address {{ subnet | PHRASE | to_ip | network | to_str }}  vrf forwarding {{ vrf }} lt;/groupgt; lt;/templategt;  lt;template name="arp"gt; lt;input load="text"gt; Protocol Address Age (min) Hardware Addr Type Interface Internet 10.12.13.2 98 0950.5785.5cd1 ARPA FastEthernet2.13 Internet 10.12.14.3 131 0150.7685.14d5 ARPA GigabitEthernet2.13 lt;/inputgt;  lt;group lookup="interface, template='interfaces', update=True"gt; Internet {{ ip }} {{ age | DIGIT }} {{ mac }} ARPA {{ interface }} lt;/groupgt; lt;/templategt; ''' parser = ttp() parser.add_template(template) parser.parse() print(parser.result(format = "json")[0])  

Это должно дать мне результат, как показано ниже, но я не получаю часть «ВЫВОД ТАБЛИЦЫ ARP», как указано в приведенном ниже коде (на самом деле мы используем поиск) :-

 [[{'FastEthernet2.13': {'description': 'Customer CPE interface',  'subnet': '10.12.13.0/24',  'vrf': 'CPE-VRF'},  'GigabitEthernet2.13': {'description': 'Customer CPE interface',  'subnet': '10.12.14.0/24',  'vrf': 'CUST1'}}],  [[{'age': '98', ## ARP TABLE OUTPUT 1  'description': 'Customer CPE interface',  'interface': 'FastEthernet2.13',  'ip': '10.12.13.2',  'mac': '0950.5785.5cd1',  'subnet': '10.12.13.0/24',  'vrf': 'CPE-VRF'},  {'age': '131', ## ARP TABLE OUTPUT 2  'description': 'Customer CPE interface',  'interface': 'GigabitEthernet2.13',  'ip': '10.12.14.3',  'mac': '0150.7685.14d5',  'subnet': '10.12.14.0/24',  'vrf': 'CUST1'}]]]  

Любая помощь будет признательна.

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Запуск вашего шаблона с помощью TTP 0.8.0 дает мне результат, который вы ожидали:

 from ttp import ttp import pprint  def test_lookup_crosstemplates():  template = """ lt;template name="interfaces"gt; lt;input load="text"gt; interface FastEthernet2.13  description Customer CPE interface  ip address 10.12.13.1 255.255.255.0  vrf forwarding CPE-VRF ! interface GigabitEthernet2.13  description Customer CPE interface  ip address 10.12.14.1 255.255.255.0  vrf forwarding CUST1 ! lt;/inputgt;  lt;group name="{{ interface }}"gt; interface {{ interface }}  description {{ description | ORPHRASE }}  ip address {{ subnet | PHRASE | to_ip | network | to_str }}  vrf forwarding {{ vrf }} lt;/groupgt; lt;/templategt;  lt;template name="arp"gt; lt;input load="text"gt; Protocol Address Age (min) Hardware Addr Type Interface Internet 10.12.13.2 98 0950.5785.5cd1 ARPA FastEthernet2.13 Internet 10.12.14.3 131 0150.7685.14d5 ARPA GigabitEthernet2.13 lt;/inputgt;  lt;group lookup="interface, template='interfaces', update=True"gt; Internet {{ ip }} {{ age | DIGIT }} {{ mac }} ARPA {{ interface }} lt;/groupgt; lt;/templategt;  """  parser = ttp()  parser.add_template(template)  parser.parse()    res = parser.result()  # pprint.pprint(res)  assert res == [[{'FastEthernet2.13': {'description': 'Customer CPE interface',  'subnet': '10.12.13.0/24',  'vrf': 'CPE-VRF'},  'GigabitEthernet2.13': {'description': 'Customer CPE interface',  'subnet': '10.12.14.0/24',  'vrf': 'CUST1'}}],  [[{'age': '98',  'description': 'Customer CPE interface',  'interface': 'FastEthernet2.13',  'ip': '10.12.13.2',  'mac': '0950.5785.5cd1',  'subnet': '10.12.13.0/24',  'vrf': 'CPE-VRF'},  {'age': '131',  'description': 'Customer CPE interface',  'interface': 'GigabitEthernet2.13',  'ip': '10.12.14.3',  'mac': '0150.7685.14d5',  'subnet': '10.12.14.0/24',  'vrf': 'CUST1'}]]]  test_lookup_crosstemplates()  

Любопытно, какую версию TTP вы используете, групповые запросы, введенные начиная с версии 0.4.0.

Если это не проблема здесь, пожалуйста, поделитесь примером результатов анализа, полученных вами от TTP, вместе с точным шаблоном и образцом данных в дополнение к ожидаемым результатам, которыми вы уже поделились изначально.

Комментарии:

1. Да, спасибо, чувак, на самом деле список «результат» здесь имеет индекс 0,1, и я печатал только первый (как это было по умолчанию в коде, приведенном в документации ttp). Спасибо за ответ :). Он работает должным образом.