1

我正在制作一个程序来计算 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 表达式的不好使用,但我不知道有更好的选择。

4

1 回答 1

2

不要使用 lambda。它们后期绑定。也许你想要一个partialfrom functools,但即使这样似乎也太复杂了。

你传入的数据有字段名称、数字和值,对吗?

您的命令行参数使用字段编号和值,对吗?

您想要一个由字段编号键入的字典。在这种情况下,您不需要任何复杂的查找。你只想要这样的东西。

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

像这样的东西应该为你处理一切。

于 2010-08-27T14:51:53.677 回答