Создайте функцию python во время выполнения, чтобы соответствовать переменному количеству словарных статей - PullRequest
1 голос
/ 27 августа 2010

Я делаю программу для расчета задержки из файла 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

Лямбды имеют позднюю привязку?Так относится ли это ко всем идентификаторам в выражении или только к тем, которые передаются в качестве аргументов?Кажется, первое верно

Каков наилучший способ достижения этой функциональности?Я чувствую, что сейчас поступаю неправильно.Может быть, это неправильное использование лямбда-выражений, но я не знаю лучшей альтернативы для этого.

1 Ответ

2 голосов
/ 27 августа 2010

Не используйте лямбды. Они имеют позднюю привязку. Возможно, вы хотите partial от functools, но даже это кажется слишком сложным.

Ваши данные имеют имена полей, номера и значения, верно?

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

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

def match( packet_dict, criteria_list ):
    t = [ packet_dict[f] == v for f,v in criteria_list ]
    return any( t )

Что-то в этом роде должно с вами справиться.

...