迁移至NumPy后,如何正确实现条件变量赋值?
解决NumPy数组的内联条件赋值问题
错误原因
你原来的and/or写法失效,是因为当"size"存在于settings中时,Python会尝试判断settings["size"](NumPy数组)的布尔值——而NumPy不允许直接对多元素数组做布尔判断,这会触发歧义错误,因为它不知道你要检查数组中是任意元素为真还是所有元素为真。而你之前的自定义vec3类应该是实现了__bool__方法,或者本身逻辑允许被隐式转布尔值,所以没这个问题。
正确的内联写法推荐
方法1:用字典的get方法(最简洁Pythonic)
字典的get方法天生适配这种场景:指定键名,若存在则返回对应值,不存在则返回默认值,完全不需要额外条件判断,也不会触发数组的布尔检查:
self.size = settings.get("size", np.array([0, 0, 0]))
方法2:用三元表达式(逻辑最清晰)
如果更倾向于显式的条件逻辑,三元表达式是安全选择——因为条件只检查键是否存在,和数组本身无关,不会触发NumPy的布尔判断问题:
self.size = settings["size"] if "size" in settings else np.array([0, 0, 0])
额外提醒:别再用原来的and/or写法
除了NumPy的问题,这种写法本身就有隐患:如果settings["size"]本身是布尔值为False的合法值(比如全0的NumPy数组),or会错误地返回默认值,而非你想要的数组。上面两种方法都能避免这个坑。
内容的提问来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

