onelinerへの道
pit を oneliner にしてみよう!!
代入は lambda では出来ないので
とりあえずすべてグローバルに入れてみる。
global の使いかた
>>> g = globals() >>> g.__setitem__('x',1) >>> print x 1
おぉ!!
変数への代入はすべてグローバルへ
g = globals() g.__setitem__("setitem", g.__setitem__) . . . setitem('set_if_t', tempfile.NamedTemporaryFile())
テストを実行して壊れてない事を確認
テストの大事さを実感!!
複数処理を oneliner 化
複数の処理を一つの式にする
os.mkdir(DIRECTORY)
os.chmod(DIRECTORY, 0700)
を一つの処理にするためには両方実行されれば良い
Python の and は左辺を処理して True だったら右辺を実行するので
>>> 1+3 and 4+5 9
and で繋げれば一つの式に出来る
os.mkdir(DIRECTORY) and os.chmod(DIRECTORY, 0700)
これだと os.mkdir の評価結果が False だった時に右辺の処理が走らないので
左辺が必ず True と評価されるようにしなくてはいけない。
[os.mkdir(DIRECTORY)]
と で括ると要素数 1 のリストになり、必ず True になる。
次の処理も and で繋げて動くように右辺も で括る。
[[os.mkdir(DIRECTORY)] and [os.chmod(DIRECTORY, 0700)]
if 文を oneliner 化
if not os.path.exists(Pit.DIRECTORY): [[os.mkdir(DIRECTORY)] and [os.chmod(DIRECTORY, 0700)]
これは三項演算子が出来たので楽
os.mkdir(DIRECTORY)] and [os.chmod(DIRECTORY, 0700)] if not os.path.exists(DIRECTORY) else True
else で True を返せばさらに and で処理を繋げられるので True を返す
……けど、全体を [] で括れば OK
[os.mkdir(DIRECTORY)] and [os.chmod(DIRECTORY, 0700)] if not os.path.exists(DIRECTORY) else True]
三項演算子を使わない場合は
(not os.path.exists(DIRECTORY)) and [[os.mkdir(DIRECTORY)] and [os.chmod(DIRECTORY, 0700)]]
さらに短くするために
- 処理が評価結果として False になる事がわかってる時は or にすれば [] も省略できるので 3 文字縮められる
- True は 1 で置き換えすれば 3 文字縮められる