Извлечение значений arg из строки, отформатированной в inspect.formatargvalues - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь проанализировать строку, отформатированную с использованием inspect.formatargvalues, и хочу иметь возможность извлечь значения аргумента и сохранить их в словаре.

ЗдесьВот несколько примеров текста:

CALL function.a(timeout_secs=10)
CALL function.b(x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30)
CALL function.c(key='A_B')
CALL function.d(target=<Tab.Chrome: 'tab-chrome'>)
CALL function.e(music_type=<MusicType.ALBUM: 1>, term=None, genre=None, results=True)
CALL function.f(button='END', delay=None)

В данный момент я извлекаю параметры, используя регулярное выражение для получения:

timeout_secs=10
x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30
key='A_B'
target=<Tab.Chrome: 'tab-chrome'>
music_type=<MusicType.ALBUM: 1>, term=None, genre=None, results=True
button='END', delay=None

Затем я делю на ',', а затемпреобразование массива в словарь.

dict(parameter.split("=") for parameter in array_of_parameters)

Это работает по большей части, но очевидно разбивается при разборе:

x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30

Есть ли способ преобразовать аргументы в словарь, где онохватывает все эти сценарии?

1 Ответ

0 голосов
/ 10 мая 2018

Невозможно найти решение, которое гарантированно будет работать во всех случаях, так как значения аргументов могут содержать что угодно, и это не правильный формат данных, предназначенный для анализа.Вот кое-что, что работает немного лучше:

import re

line = 'x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30'

print(re.findall(r'(?:^|, )(\w+)=(.+?)(?=$|, \w+=)', line))
# [('x', 'something good (happy days, ABC 123)'), ('y_z', 'None'), ('check_this', 'True'), ('check_this_2', 'None'), ('extra_info', 'None'), ('press', 'False'), ('timeout_secs', '30')]

Объяснение:

  1. (?:^|, ): аргумент должен быть в начале строки или начинаться с запятой и пробела,Это группа без захвата, которая содержит эффект | и не отображается в результатах findall.
  2. (\w+): имя аргумента
  3. (.+?):значение аргумента.
  4. (?=$|, \w+=): за значением аргумента должен следовать конец строки или другой аргумент.Это косвенное утверждение, а не просто группа без захвата, поэтому совпадение не использует строку.В противном случае findall находит только каждый второй аргумент, поскольку находит только непересекающиеся совпадения.
...