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

```

    if not variable:
        variable = value
    
```

Noneの場合は:

```

    if variable is None:
        variable = value
    
```

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

```

    def setdefault(variable, value):
        if not variable:
            return value
    
    variable = setdefault(variable, value)
    
```

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

何か良い方法はないでしょうか。ご教授願います。
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行で書けます。

```

    variable = value if variable is None else variable
    
```

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

```

    In [1]: None or 1
    Out[1]: 1
    
    In [2]: 0 or 1
    Out[2]: 1
    
```

偽として扱われる値については[こちら](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行になります。

```

    variable = value if variable is None else v
    
```

["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