Python中尝试get_by_url_prefix时触发TypeError报错求助
解决TypeError: type object argument after ** must be a mapping, not NoneType问题
嘿,这个问题我之前也踩过坑!你碰到的错误核心原因很明确:Database.find_one()没有找到匹配url_prefix条件的文档,所以返回了None。而你直接用**None来实例化类(cls(**...)),这自然会触发类型错误——毕竟**只能接收字典这类映射类型,None肯定不行呀。
下面给你几个具体的解决步骤:
1. 先检查查询结果,避免直接用None实例化
在实例化类之前,先把查询结果存下来,判断是否存在,这样就能避免踩坑了:
result = Database.find_one(StoreConstants.COLLECTION, {'url_prefix':{"$regex": '^{}'.format(url_prefix)}}) if result is None: # 这里根据你的业务需求处理就行,比如抛个明确的异常,或者返回None raise ValueError(f"找不到以'{url_prefix}'开头的url_prefix记录哦") # 要是允许空结果的话,也可以直接 return None return cls(**result)
2. 检查正则表达式是否正确
有时候不是没数据,是你的正则匹配出问题了!比如如果url_prefix本身包含.、*这类正则特殊字符,直接拼接会导致匹配失效,记得先转义:
import re escaped_prefix = re.escape(url_prefix) result = Database.find_one(StoreConstants.COLLECTION, {'url_prefix':{"$regex": f'^{escaped_prefix}'}})
3. 确认集合和字段名没搞错
别忽略细节!检查下StoreConstants.COLLECTION对应的集合名称是不是正确的,还有MongoDB里的字段名是url_prefix吗?MongoDB可是区分大小写的哦,别因为大小写不匹配导致查不到数据。
4. 调试查询语句,手动验证
实在找不到原因的话,把查询条件打印出来,去MongoDB客户端手动执行一下,看看能不能查到数据:
query = {'url_prefix':{"$regex": '^{}'.format(url_prefix)}} print(f"当前执行的查询条件:{query}") result = Database.find_one(StoreConstants.COLLECTION, query)
额外小建议
如果你的业务逻辑允许没有匹配结果的情况,也可以考虑返回None或者一个默认的类实例,具体怎么处理就看你的需求啦。
内容的提问来源于stack exchange,提问作者Sartaj
相关产品推荐
相关产品推荐

