37597


変数に値が入っていなければ値を代入し、入っていれば何もしない処理を、  
現在は次のようにしています。

[code]

    if not variable:
        variable = value
    
[/code]

Noneの場合は:

[code]

    if variable is None:
        variable = value
    
[/code]

出来れば、辞書型の"variable.setdefault(value)"のように一行で書きたいと思っております。  
関数を作ろうとも思ったのですが、

[code]

    def setdefault(variable, value):
        if not variable:
            return value
    
    variable = setdefault(variable, value)
    
[/code]

のようになり、変数名を引数として渡すのもスマートでは無いなと。。

何か良い方法はないでしょうか。ご教授願います。


CC BY-SA 3.0
2017-08-30T02:29:22.973
37591
2017-08-30T03:22:57.610
2017-08-30T02:58:19.613
19110
24908
question
python
変数に値が入っていなければ値を代入し、入っていれば何もしない処理をスマートにできないでしょうか。


三項演算子風の`if`を使えば1行で書けます。

[code]

    variable = value if variable is None else variable
    
[/code]

もしくは`None`が偽と解釈されることと、ブール演算子が短絡評価されることを利用して`or`を使って書けますね。ただし、`0`や空文字列`""`、空リスト`[]`も偽と解釈されてしまうので注意が必要です。

[code]

    In [1]: None or 1
    Out[1]: 1
    
    In [2]: 0 or 1
    Out[2]: 1
    
[/code]

偽として扱われる値については[こちら](https://docs.python.jp/3/library/stdtypes.html#truth-
value-testing)に一覧があります。


CC BY-SA 3.0
2017-08-30T03:19:45.733
37596
2017-08-30T03:19:45.733
13199
37591
answer


一応、同じプログラムを三項演算子で書くと1行になります。

[code]

    variable = value if variable is None else v
    
[/code]

["PEP 505 -- None-aware operators"](https://www.python.org/dev/peps/pep-0505/)
の "Existing Alternatives" という節に他の方法も載っています。そこにも書いてあるように、[Request
パッケージ](https://github.com/requests/requests/blob/14a555ac716866678bf17e43e23230d81a8149f5/requests/models.py#L212)では上の書き方が使われています。


CC BY-SA 3.0
2017-08-30T03:22:57.610
37597
2017-08-30T03:22:57.610
19110
37591
answer