You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:21