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

Flask Web服务中验证带空格属性的数据对象完整性求助

解决带空格属性名的验证问题

让我来帮你搞定这个属性验证的困扰。首先得理清为什么你之前用in和hasattr都失效了——这和Python的属性命名规则以及你加载JSON的方式直接相关:

当你通过self.__dict__ = json.loads(j)把带空格的JSON键赋值给对象时,这些带空格的名称确实会存在于对象的__dict__字典中,但Python不允许用.访问带空格的属性(比如item.from value是语法错误)。因此hasattr(item, "from value")会返回False,因为它在尝试查找一个符合标识符规则的属性,而非__dict__里的字符串键;而"from value" in item也不生效,因为默认对象没有实现__contains__方法来检查__dict__的键。

正确的验证方式

既然这些属性名实际存储在对象的__dict__字典里,我们直接检查这个字典的键即可。下面是修正后的验证代码:

class DataSetValidator(object):
    def validate(self, dsList, convert):
        if not dsList or len(dsList) < 1:
            raise BadRequest("either Convert List or Data Set Source required.")
        
        # 收集所有需要验证的必填字段
        required_fields = [
            convert.INPUT_CURRENCY,
            convert.INPUT_AMOUNT,
            convert.RETURN_CURRENCY,
            convert.RETURN_VALUE
        ]
        
        for item in dsList:
            for field in required_fields:
                # 直接检查对象__dict__字典中是否包含目标键
                if field not in item.__dict__:
                    raise BadRequest(f"{field} property not found.")
        return True

额外优化建议(可选)

如果可以控制输入JSON的格式,或者在加载阶段做预处理,建议把带空格的键转换成符合Python规范的命名(比如用下划线替换空格),这样后续的属性访问和验证都会更顺畅。比如修改DataSetContract的初始化逻辑:

class DataSetContract(object):
    def __init__(self, j):
        data = json.loads(j)
        # 将带空格的键转换为下划线命名
        cleaned_data = {key.replace(" ", "_"): value for key, value in data.items()}
        self.__dict__.update(cleaned_data)

之后只需要同步调整FxConvertContract里的属性名(比如把INPUT_CURRENCY对应的值改成"from_value"),就能用hasattr进行正常验证了。

内容的提问来源于stack exchange,提问作者Abhash786

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:17