在运行时创建一个Python函数以匹配可变数量的字典条目

1 投票
1 回答
1002 浏览
提问于 2025-04-16 03:23

我正在制作一个程序,用来计算从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']]

(其中每个子列表的第一个元素是字段编号,第二个元素是值)

我尝试遍历这个规则列表来累积一个lambda表达式:

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

lambda表达式是延迟绑定的?那么这适用于表达式中的所有标识符,还是仅适用于作为参数传入的那些?看起来前者是对的。

实现这个功能的最佳方法是什么?我觉得我现在的做法可能不太对。也许这是对lambda表达式的错误使用,但我不知道更好的替代方案。

1 个回答

2

别用lambda表达式。它们是晚绑定的。也许你想用functools里的partial,但那看起来也太复杂了。

你输入的数据有字段名、数字和数值,对吧?

你的命令行参数使用的是字段数字和数值,对吧?

你想要一个以字段数字为键的字典。在这种情况下,你不需要复杂的查找。你只需要像下面这样。

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

这样的东西应该能帮你处理所有事情。

撰写回答