如何快速检查Python对象字段是否为空?
Python 快速检查对象所有必填字段非空的方案
你当前通过逐个字段调用is_blank方法判断signal对象的必填字段是否为空,代码重复度高。现有代码示例:
if self.is_blank(signal.provider_id): error_response = "Signal rejected. No signal provider id given." elif self.is_blank(signal.sequence_id): error_response = "Signal rejected. No signal sequence id provided." # 更多字段的判断...
你的is_blank函数逻辑存在问题(与注释描述不符),原函数:
def is_blank (self, string): """Checks for None and empty values""" return True if string and string.strip() else False
该函数会在值非空时返回True,与“检查None和空值”的预期相反,需要先修正。
先修正is_blank函数
正确实现“检查值是否为None或空字符串(含全空格)”的逻辑:
def is_blank(self, value): """检查值是否为None或空字符串(含全空格)""" return value is None or (isinstance(value, str) and value.strip() == "")
方案1:定义字段列表遍历(原生Python,最灵活)
将需要检查的字段名和对应的错误提示整理成列表,通过循环遍历实现批量检查,避免重复代码:
# 定义必填字段与错误提示的映射 required_fields = [ ("provider_id", "No signal provider id given."), ("sequence_id", "No signal sequence id provided."), # 新增字段只需在这里添加一行 ] error_response = None for field_name, error_msg in required_fields: field_value = getattr(signal, field_name) if self.is_blank(field_value): error_response = f"Signal rejected. {error_msg}" break # 找到第一个错误即停止,与原逻辑一致
- 原理:用
getattr(signal, field_name)动态获取对象的字段值,遍历列表完成所有检查 - 优势:新增字段只需在列表中添加,无需修改判断逻辑,代码可维护性高
方案2:用dataclass实现初始化时验证(Python 3.7+)
如果signal是自定义类,可借助dataclass实现字段验证,在对象初始化阶段就拦截空值:
from dataclasses import dataclass, field def validate_not_blank(value): if value is None or (isinstance(value, str) and value.strip() == ""): raise ValueError(f"Field cannot be blank") return value @dataclass class Signal: provider_id: str = field(default=None, metadata={"validator": validate_not_blank}) sequence_id: str = field(default=None, metadata={"validator": validate_not_blank}) # 其他字段... # 初始化时自动验证 try: signal = Signal(provider_id="", sequence_id="123") except ValueError as e: error_response = f"Signal rejected. {e}"
- 扩展:如果需要更复杂的验证,可结合
pydantic库(需安装),它提供更强大的字段验证能力
方案3:用attrs库简化验证(第三方库)
attrs是一个简化类定义的库,原生支持字段验证,无需手动写验证逻辑:
import attrs @attrs.define class Signal: provider_id: str = attrs.field(validator=attrs.validators.not_blank()) sequence_id: str = attrs.field(validator=attrs.validators.not_blank()) # 其他字段... # 初始化时自动触发验证 try: signal = Signal(provider_id=" ", sequence_id="") except attrs.exceptions.ValidationError as e: error_response = f"Signal rejected. {e}"
- 需先安装:
pip install attrs
内容的提问来源于stack exchange,提问作者feder
相关产品推荐
相关产品推荐

