Python その他 ガジェット部 研究部

シングルライン(一行)でelseで何もしない条件分岐を書きたかった話【Python】

結果的にはめちゃくちゃ単純なことなんだけど,なぜかそこに行きつかなかった時の話.

やりたかったことは,

def hello():
    print('hello')
flag = True
hello() if flag else ?????

みたいな感じ.もし flag = False だったら何もしたくない,ということ.

なぜか,python の三項演算子で書こうとしてしまう.

そもそも Python の三項演算子って,

flag = True
a = 'True!' if flag else 'False!'
print(a)
# True!

flag = False
a = 'True!' if flag else 'False!'
print(a)
# False!

こんな感じで書けて,a=~ の部分は何かしらの関数にも置き換えれる.

def print_true():
    print('True!')
def print_false():
    print('False!)

flag = True
print_true() if flag else print_false()
# True!

flag = False
print_true() if flag else print_false()
# False!

で,仮にこんな風に,else 以降を書かないと

flag = True
print_true() if flag
#SyntaxError: invalid syntax

SyntaxError になりますよ,と.

じゃあ,pass を使ってみよう!と考える.

pass は

def hello(flag):
    if flag:
        print('hello!')
    else:
        pass

hello(True)
# hello!
hello(False)
# (何も返らない)

こんな感じで条件分岐で何もしたくない時に使ったりします.

これを三項演算子にも使えるんじゃ,と思ったわけ

def print_true():
    print('True!')

flag = True
print_true() if flag else pass

# SyntaxError: invalid syntax

SyntaxError になる.普通の関数がありならば,こういう風に書いたら如何だろうか

def print_true():
    print('True!')

def passer():
    pass

flag = True
print_true() if flag else passer()
# True!

flag = False
print_true() if flag else passer()
# (何も返らない)

pass だけする関数でラップすれば行ける.

どうやら,三項演算子は,何かしらの戻り値(Noneでも良い)があるものじゃないとダメみたいですね.

pass を関数でラップすれば戻り値(None)を持つようになるので,それでうまく言ったみたいです.

def passer():
    pass
a = passer()
print(type(a))
# <class 'NoneType'>

a = pass
#   a = pass
#        ^
# SyntaxError: invalid syntax

これでうまくいった.と思って半日くらいしてから気づく.

def hello():
    print('hello')
flag = True
if flag: hello()
# hello

flag = False
if flag: hello()
# (もちろん何も返りません)

if 文をシングルラインで書く = 三項演算子

という頭になってしまっていましたね.頭の硬さに驚きです.

まあ,三項演算子に対する理解が深くなったと思ってポジティブに考えよ.

-Python, その他, ガジェット部, 研究部