为何sidewalk_score始终为NoneType而sidewalk_width可正常读取?
我有一个用于接收人行道数据并为交通模型解析数据的对象类。在模型的某个环节,会使用人行道宽度和路面状况的函数生成评分。值得注意的是,宽度和路面状况评分在整个流程中的处理方式完全相同,但sidewalk_width初始化为int类型,而sidewalk_score初始化为NoneType。由于是NoneType,任何赋值操作都无法生效,因此它始终返回None,即便看起来应该已被赋值。
Sidewalk()类对象的生成代码如下:
class Sidewalk(object): def __init__(self, **kwargs): self.sidewalk_width = kwargs.get("sidewalk_width") self.sidewalk_score = kwargs.get("sidewalk_condition_score")
具体记录的赋值代码块如下:
def get_plts(path): with fiona.open(path, 'r', layer='plts') as src: driver = src.driver crs = src.crs schema = src.schema for f in src: data = f['properties'] sidewalks = [Sidewalk( sidewalk_width=data['sidewalk_width'], sidewalk_score=data['sidewalk_condition_score'])]
它们最终会传入以下函数:
def _calculate_condition_score(self, sidewalk): width = sidewalk.sidewalk_width cond = sidewalk.sidewalk_score
在初始化前,脚本可以正常读取地理数据包(geopackage)中的数字。宽度和状况评分在geopackage中均被设为整数类型。若街道无人行道,仅该记录的width会显示为"None",其余记录的width会正常显示整数值;但无论何种情况,condition score始终为"None"。
为何width能全程正常读取,而condition却始终被锁定为NoneType?我已在模型各处添加打印语句,发现问题出在初始化前后。当模型开始处理数据时,类型问题已产生,状况评分的数值仅会显示为"Null"。
问题根源是关键字参数名不匹配:
Sidewalk类的__init__方法中,通过kwargs.get("sidewalk_condition_score")获取路面状况评分的值,赋值给self.sidewalk_score- 但创建
Sidewalk实例时,传入的参数名是sidewalk_score=data['sidewalk_condition_score']
由于kwargs字典里找不到sidewalk_condition_score这个键,kwargs.get()默认返回None,导致self.sidewalk_score始终为None。而宽度参数的键sidewalk_width在定义和调用时完全一致,因此能正常获取值。
只需让参数键名在类定义和实例创建时保持一致即可修复,两种方案任选其一:
方案一:修改实例创建代码
sidewalks = [Sidewalk( sidewalk_width=data['sidewalk_width'], sidewalk_condition_score=data['sidewalk_condition_score'])]
方案二:修改Sidewalk类的初始化方法
class Sidewalk(object): def __init__(self, **kwargs): self.sidewalk_width = kwargs.get("sidewalk_width") self.sidewalk_score = kwargs.get("sidewalk_score")
内容的提问来源于stack exchange,提问作者armchairavenger

