

1+None=1というようにNoneを数字的に0と計算の時のみ置きたいのですがどうすればいいでしょうか。0と置けなくても1+None=1が成立すれば大丈夫です。


CC BY-SA 4.0
2022-11-07T02:34:53.910
92050
2022-11-07T05:09:15.857
2022-11-07T05:03:35.147
3054
55237
question
python
PythonでNone=0と置きたいです


こういうことでしょうか?

[code]

    def Add(x,y):
        return (x if x else 0) + (y if y else 0)
    
    
    print(Add(10,1))        # 11
    print(Add(10,None))     # 10
    print(Add(None,1))      # 1
    print(Add(None,None))   # 0
    
[/code]


CC BY-SA 4.0
2022-11-07T03:03:39.623
92052
2022-11-07T03:03:39.623
13127
92050
answer


Python では出来ないはずです。

  * `+` 演算子は左辺の `__add__` や 右辺の `__radd__` を実行します
  * `1 + None` の場合、両辺は `int` と `NoneType` です
  * これらのタイプ（クラス）は組込み型であり、`__add__` などを変更できません
  * よって、この式での `+` の振舞いは変更できません

独自の型を用意すれば、その型に対する `+` の振舞いを変更することは出来ます。

例:

[code]

    class N(int):
    
        def __add__(self, other):
            if other == None:
                other = 0
            return N(super().__add__(other))
    
        def __radd__(self, other):
            return self.__add__(other)
    
    n0 = N(0)
    n1 = N(1)
    n2 = N(2)
    
    print(f"{ n1   + None       = }")  # 1
    print(f"{ None + n1         = }")  # 1
    print(f"{ n1   + 2          = }")  # 3
    print(f"{ 1    + n2         = }")  # 3
    print(f"{ n1   + n2         = }")  # 3
    print(f"{ n0   + 1 + None   = }")  # 1
    
[/code]

きちんと完成させるならば、他にもメソッドを定義して、[数値型をエミュレートする](https://docs.python.org/ja/3/reference/datamodel.html#emulating-
numeric-types)必要が有ります。[SymPy](https://www.sympy.org/en/index.html)
などは、こういったアプローチです。


CC BY-SA 4.0
2022-11-07T05:02:38.017
92057
2022-11-07T05:02:38.017
3054
92050
answer


Noneに対して`+`演算子を使った時の`unsupported operand type(s) for +: 'int' and
'NoneType'`例外を回避する方法はなく、他の回答のようにある程度冗長な記述が要求されると思います。  
ちなみに`None or 0`のようにor演算子を使って0を取得する方法もあります。

[code]

    x, y = 1, None
    print((x or 0) + (y or 0)) # 1が返る
    
[/code]


CC BY-SA 4.0
2022-11-07T05:09:15.857
92058
2022-11-07T05:09:15.857
9820
92050
answer