背景
たとえば、
from fabric.api import run
def test(flag=False):
if flag is True:
run("echo hoge")
else:
run("echo fuga")
とか書いて、
$ fab -H host test:flag=True
とか実行しようとすると、
fuga
が出力されたりする。
Fabric で渡す引数は str。
>>> "True" is True
False
なんらかの形で変換をかけてやる必要がある。
対応策
その1 キャストする
単純にキャストする。
from fabric.api import run
def test(flag=True):
if bool(flag) is True:
run("echo hoge")
else:
run("echo fuga")
$ fab -H host test:flag=False
fuga
だけど、
$ fab -H host test:flag=false
とかで死にます。"True"
/"False"
はbooleanにキャスト出来るけど、"true"
/"false"
はキャスト出来ない
その2 strtobool
標準ライブラリにこんなやつが。
from distutils.util import strtobool
from fabric.api import run
def __strtobool(arg):
return bool(strtobool(arg))
def test(flag="True"):
flag = __strtobool(flag)
if flag is True:
run("echo hoge")
else:
run("echo fuga")
こんな感じで書く。これを使うと、"True"
とかの代わりに"y", "t", on"とかそれっぽい諸々の文字列が使えるようになる。
ただし、def test(flag=True):
とか、デフォルト引数にboolean型のまま書くとエラー吐いて落ちる。
そのときのための折衷案とかを用意する。ついでに、strtobool() に変換出来ない文字列突っ込んだときのために例外も取ってみる。
def __strtobool(arg):
try:
if type(arg) == type(True):
return arg
else:
return bool(strtobool(arg))
except ValueError:
...
なんかだんだん面倒くさくなってきますね。