Я делаю программу для вычисления задержки из файла tcpdump/pcap, и я хочу иметь возможность указывать правила в командной строке для корреляции пакетов - то есть найти время, затраченное на отправку правила сопоставления пакетов A на прием правило B сопоставления пакетов (конкретный пример будет отправлен FIX NewOrderSingle и будет получен соответствующий FIX ExecutionReport).
Это пример полей в пакете (до того, как они были преобразованы в форму словаря). Я тестирую числовую версию поля (в скобках), а не английскую версию:
BeginString (8): FIX.4.2
BodyLength (9): 132
MsgType (35): D (ORDER SINGLE)
SenderCompID (49): XXXX
TargetCompID (56): EXCHANGE
MsgSeqNum (34): 1409104
SendingTime (52): 20100723-12:49:52.296
Side (54): 1 (BUY)
Symbol (55): A002
ClOrdID (11): BUY704552
OrderQty (38): 1000
OrdType (40): 2 (LIMIT)
Price (44): 130002
TimeInForce (59): 3 (IMMEDIATE OR CANCEL)
QuoteID (117): A002
RelatdSym (46): A002
CheckSum (10): 219 [correct]
В настоящее время у меня есть аргументы, выходящие из командной строки во вложенный список:
[[35, 'D'], [55, 'A002']]
(где первый элемент каждого подсписка - это номер поля, а второй - значение)
Я пробовал перебирать этот список правил для накопления выражения лямбда:
for field, value in args.send["fields_filter"]:
if matchers["send"] == None:
matchers["send"] = lambda fix : field in fix and fix[field] == value
else:
matchers["send"] = lambda fix : field in fix and fix[field] == value and matchers["send"](fix)
Когда я запускаю программу, я получаю вывод:
RuntimeError: maximum recursion depth exceeded in cmp
Lambdas являются поздними связями? Значит ли это применимо ко всем идентификаторам в выражении или только к тем, которые были переданы в качестве аргументов? Кажется, что первое верно.
Какой лучший способ достичь этой функциональности? Я чувствую, что в настоящее время я ошибаюсь. Может быть, это плохое использование лямбда-выражений, но я не знаю лучшей альтернативы для этого.
Не используйте лямбды. Они являются поздними связями. Возможно, вам нужен partial
от functools
, но даже это кажется слишком сложным.
Входящие данные имеют имена полей, цифры и значения, верно?
В параметрах командной строки используются номера и значения полей, правильно?
Вам нужен словарь с номером поля. В этом случае вам не нужны сложные поисковые запросы. Вам просто нужно что-то подобное.
def match( packet_dict, criteria_list ):
t = [ packet_dict[f] == v for f,v in criteria_list ]
return any( t )
Что-то вроде этого должно обрабатывать все для вас.