Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

背景

たとえば、

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away