LoginSignup
3
1

More than 5 years have passed since last update.

[Fabric]引数にbooleanを使おうとしてはまったので対策をメモ

Last updated at Posted at 2014-12-11

背景

たとえば、

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:
        ...

なんかだんだん面倒くさくなってきますね。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1