ipdb调试列表表达式报NameError且Edge定义判断结果不符合预期
问题根源
1. 代码逻辑错误(运行返回False的原因)
你原来的判断逻辑存在根本性错误:
- 执行
[fvc['from_vertex_collections'] for fvc in arangograph.edge_definitions()]得到的结果是[['nj_NODES']],是嵌套列表 - 你后续判断的
item是from_node_collections里的元素,也就是字符串'nj_NODES',直接判断字符串在嵌套列表里,永远返回False - 你之前遇到的
TypeError: unhashable type: 'list'也是同理:fvclist里的元素是列表,列表不可哈希,无法作为set的元素,所以调用issubset直接报错。
正确的逻辑应该是:先找到和指定edge_collection匹配的边定义,再单独判断这条边定义的from_vertex_collections和to_vertex_collections是否包含你传入的节点集合。
2. ipdb报NameError的原因
这是你使用的IPython 7.24.0版本的已知bug:列表推导式、生成器表达式有独立的内部作用域,旧版本ipdb没有把当前栈的局部变量正确注入到推导式的作用域中,所以在推导式内部访问外部变量会触发NameError,而普通的单行非推导式语句可以正常访问变量。
修复方案
代码逻辑修复
替换为以下正确实现:
@staticmethod def doesGraphHasEdgeDefinition(arangograph, edge_collection, from_node_collections, to_node_collections): for edge_def in arangograph.edge_definitions(): if edge_def["edge_collection"] != edge_collection: continue # 匹配到目标边集合后,校验from/to集合为子集即可 if set(from_node_collections).issubset(edge_def["from_vertex_collections"]) \ and set(to_node_collections).issubset(edge_def["to_vertex_collections"]): return True logging.debug("From/To node collections do not match existing edge definition") return False logging.debug("Specified edge collection does not exist in the graph") return False
调试避坑方案
- 调试时尽量不要直接在ipdb中写包含推导式、生成器的语句,先把中间结果提取为外层临时变量,再逐行判断
- 升级IPython到7.30及以上版本,该作用域bug已经在后续版本修复
- 复杂逻辑优先打日志输出中间结果,避开ipdb的作用域限制
内容的提问来源于stack exchange,提问作者Qohelet
相关产品推荐
相关产品推荐

