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 文字縮められる