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

在运行时创建一个python函数,以匹配数量可变的字典条目,python,dynamic,lambda,matching,Python,Dynamic,Lambda,Matching,我正在制作一个程序来计算tcpdump/pcap文件的延迟,我希望能够在命令行上指定关联数据包的规则——即,找到从发送数据包匹配规则a到接收数据包匹配规则B所花费的时间(具体示例是发送一个FIX NewOrderSingle并接收相应的FIX ExecutionReport) 这是数据包中字段的一个示例(在它们被转换为字典形式之前)——我正在测试字段的数字版本(在括号中),而不是英语版本: BeginString (8): FIX.4.2 BodyLength (9): 132

我正在制作一个程序来计算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表达式的错误用法,但我不知道更好的替代方法。

不要使用lambda。它们是后期绑定的。也许你想从
functtools
获得
部分
,但是即使这样也似乎太复杂了

输入的数据包含字段名、数字和值,对吗

命令行参数使用字段号和值,对吗

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

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

类似的东西应该可以为您处理所有事情。

我不太确定您的代码试图完成什么…但最后一行看起来像一个经典的递归函数。您正在将lambda函数分配给matchers dict so mathers['send'](修复)的'send'键是一个递归调用。没有终止条件,所以它只运行直到它炸毁堆栈。我不能说lambda设计是否“好”,但这个特殊的问题看起来像是一个典型的实现错误。@Rakis:所以我试图编译的东西是这样的:
35 in fix and fix[35]==“D”和(固定中的55和固定[55]=“A002”)
其中的术语将取决于从命令行输入的内容。请参阅S.Lott的答案,因为这总结了我想要的内容。感谢partial的建议,我正在查看它。我试图避免每次都进行迭代,因为我正在针对数百万个数据包的转储运行此程序,并认为这会生成某种ma在开始时调用函数,每次调用都会更有效率。我会试一试,看看它的性能有多好。@davedavedave:partial不会有多大帮助。字典哈希查找是即时的。criteria循环很小,开销非常小。