Python ~True廃止案の経緯
Pythonで~Trueと書くと結果は-2になります。しかし、これは多くの開発者にとって直感に反する挙動です。なぜなら、「Trueの否定」を期待する人が多いからです。そこでPython 3.16での廃止が決まりました。
具体的には、~はビット反転演算子です。またbool型はint型のサブクラスです。つまりTrueは整数1として扱われます。そのため~Trueは~1で-2になります。さらに~Falseは-1です。このように、論理否定とは全く異なる結果になります。
廃止を推進する側の主張
廃止派にはいくつかの根拠があります。まず、if ~conditionのような無意識的なバグを引き起こす点です。また、NumPyやSymPyでは~が論理否定として使われています。つまり、ライブラリ間で意味が異なり混乱を招きます。
さらに、実際に~boolを使う場面はほぼありません。そのため、廃止しても実用上の影響は少ないという判断です。具体的には、廃止期間を経て最終的にTypeErrorを発生させる計画です。
廃止に反対する側の主張
一方で反対意見もあります。まず、リスコフの置換原則に違反するという指摘です。なぜなら、boolがintのサブクラスなら全てのint演算が機能すべきだからです。
またビットマスク操作などの正当な用途を削除することへの懸念もあります。さらに、+や-、*など他の演算子との不整合も問題です。つまり、~だけを禁止する論理的根拠が弱いという主張です。しかし、廃止後は~int(b)と明示的に書けば同じ結果を得られます。
演算子の安全設計から学べること
この議論から演算子設計について学べることがあります。まず、直感的でない挙動は避けるべきです。また型の継承関係が予期しない結果を生む場合があります。さらに、ライブラリ間での意味の一貫性も重要です。つまり、言語設計では「驚き最小の原則」が大切です。
まとめ
Python ~True廃止案は直感に反する挙動を解消する試みです。特にboolとintの継承関係が問題の根本にあります。したがって、演算子設計では型の相互作用と直感的な挙動のバランスを考慮することが重要です。
