在运行时创建一个Python函数以匹配可变数量的字典条目
我正在制作一个程序,用来计算从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 )
这样的东西应该能帮你处理所有事情。