切换至Jupyter Notebook运行Python代码出现IndentationError缩进错误
问题根因
触发该IndentationError的核心原因是代码中类方法、逻辑块的缩进层级完全错位,并非单纯的Tab与空格混用问题,同时代码还存在两处语句截断,即便修复缩进也会触发语法错误,具体错误点如下:
- 第14行
def way(self, w):是StreetsHandler类的成员方法,需要和类内__init__方法保持同级缩进(相对class关键字缩进4个空格),当前代码将其顶格写在类外层,Python无法识别其为类的组成部分 - 第21行
row = { "w_id": w.id, "geo": geo }属于道路属性判断分支内的代码,当前缩进层级错误,且位置处于try/except块外,若异常触发return逻辑会出现geo变量未定义的运行时错误 - 第42行
self.num_relations += 1属于relation方法内的计数逻辑,当前顶格写在方法外层,缩进层级不匹配 - 两处语句截断:第15行判断条件末尾
is no应为is not None,第30行判断条件末尾r.tags.get("name"未补全,应为r.tags.get("name") is not None
修正后可运行代码
import osmium import shapely.wkb as wkblib class StreetsHandler(osmium.SimpleHandler): def __init__(self): osmium.SimpleHandler.__init__(self) self.num_nodes = 0 self.num_relations = 0 self.num_ways = 0 self.street_relations = [] self.street_relation_members = [] self.street_ways = [] # 全局工厂,用于从OSM几何对象生成WKB格式数据 self.wkbfab = osmium.geom.WKBFactory() def way(self, w): if w.tags.get("highway") is not None and w.tags.get("name") is not None: try: wkb = self.wkbfab.create_linestring(w) geo = wkblib.loads(wkb, hex=True) except: return row = { "w_id": w.id, "geo": geo } for key, value in w.tags: row[key] = value self.street_ways.append(row) self.num_ways += 1 def relation(self, r): if r.tags.get("type") == "associatedStreet" and r.tags.get("name") is not None: row = { "r_id": r.id } for key, value in r.tags: row[key] = value self.street_relations.append(row) for member in r.members: self.street_relation_members.append({ "r_id": r.id, "ref": member.ref, "role": member.role, "type": member.type, }) self.num_relations += 1
修复注意事项
- 所有类内方法统一相对
class关键字缩进4个空格,方法内的条件分支、循环、异常捕获块再相对方法定义缩进4个空格,全程使用空格缩进,不要混用Tab - 将错位的
row初始化、self.num_relations +=1放回对应逻辑块的正确缩进层级 - 补全被截断的条件判断语句,调整
row初始化位置到try块之后,避免异常触发时出现变量未定义问题 - 不同方法之间保留空行,避免Jupyter Notebook代码解析时出现token识别错误
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

