Blender Python实现mesh条件打印的格式与语法问题排查
网格对象父级判断输出问题排查与修正
问题本质
所有报错、输出格式不对的核心原因是对Python三元表达式的作用范围理解不到位,没有让print函数完整覆盖两个判断分支,再加上逗号运算符、三元表达式本身的优先级规则干扰,最终导致逻辑和预期完全错位。
各写法的具体问题
- 第一种写法:三元表达式仅在mesh存在父级时调用
print,无父级时的分支直接返回元组(mesh.name, "no Parent"),没有被print包裹。在控制台运行时,未被赋值的表达式会被自动回显原生格式(带括号、单引号),因此出现不符合要求的输出。 - 第二种写法:三元表达式仅用于切换第二个参数的取值,但
print的参数列表中硬编码了"no Parent"作为第三个独立参数,无论判断结果如何都会被输出;同时无父级时三元分支选择了mesh.name作为第二个参数,因此出现内容重复、冗余拼接的问题。 - 第三种写法:
print的闭合括号提前结束了函数调用范围,三元表达式的else分支游离在print之外,完全不符合Python三元表达式值A if 条件 else 值B的语法结构,因此直接触发语法错误。 - 第四种写法:受Python运算符优先级影响(三元表达式优先级低于逗号),整个语句被逗号拆分为两部分:第一部分是带print的三元判断逻辑,第二部分是独立的
"no Parent"字符串。当mesh存在父级时,print正常输出后,返回的None值会和独立的字符串拼成元组(None, "no Parent")被控制台回显;无父级时同样因为未调用print,直接回显了元组内容。
正确实现方式
核心逻辑是先通过三元判断得到需要输出的父级信息,再统一传给print函数输出,从根源上避免优先级错位的问题:
for mesh in objects: if mesh.type == "MESH" and mesh.users > 0: if not mesh.modifiers: # 先计算父级信息,再执行统一打印 parent_label = mesh.parent.name if mesh.parent else "no Parent" print(mesh.name, parent_label)
运行后输出完全符合预期:
01M_M-スカート_3_1 rigidbodies 01N_M-スカート_4_1 rigidbodies Cube no Parent smd_bone_vis no Parent
也可以把三元逻辑直接内嵌在print的参数中,只要保证三元表达式的完整范围被print括号包裹即可:
for mesh in objects: if mesh.type == "MESH" and mesh.users > 0: if not mesh.modifiers: print(mesh.name, mesh.parent.name if mesh.parent else "no Parent")
内容的提问来源于stack exchange,提问作者PteJack
相关产品推荐
相关产品推荐

