如何将bool参数传递给fabric命令

whi*_*whi 22 python boolean fabric

目前我正在使用fab -f check_remote.py func:"arg1","arg2"...fab远程运行.

现在我需要发送一个bool arg,但是True/False变成了一个字符串arg,如何将它设置为bool类型?

Eng*_*ost 40

我正在使用这个:

from distutils.util import strtobool

def func(arg1="default", arg2=False):
    if arg2:
        arg2 = bool(strtobool(arg2))
Run Code Online (Sandbox Code Playgroud)

到目前为止对我有用.它将解析值(忽略大小写):

'y', 'yes', 't', 'true', 'on', '1'
'n', 'no', 'f', 'false', 'off', '0'
Run Code Online (Sandbox Code Playgroud)

strtobool返回0或1,这就是为什么bool需要转换为True/False布尔值.

为了完整起见,这strtobool是实施:

def strtobool (val):
    """Convert a string representation of truth to true (1) or false (0).

    True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
    are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
    'val' is anything else.
    """
    val = val.lower()
    if val in ('y', 'yes', 't', 'true', 'on', '1'):
        return 1
    elif val in ('n', 'no', 'f', 'false', 'off', '0'):
        return 0
    else:
        raise ValueError("invalid truth value %r" % (val,))
Run Code Online (Sandbox Code Playgroud)

稍微好一点的版本(感谢评论mVChr)

from distutils.util import strtobool

def _prep_bool_arg(arg): 
    return bool(strtobool(str(arg)))

def func(arg1="default", arg2=False):
    arg2 = _prep_bool_arg(arg2)
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单和最好的答案.令人遗憾的是strtobool实际上并没有返回`bool` - 它返回一个`int`! (2认同)

cha*_*lax 14

我会用一个函数:

def booleanize(value):
    """Return value as a boolean."""

    true_values = ("yes", "true", "1")
    false_values = ("no", "false", "0")

    if isinstance(value, bool):
        return value

    if value.lower() in true_values:
        return True

    elif value.lower() in false_values:
        return False

    raise TypeError("Cannot booleanize ambiguous value '%s'" % value)
Run Code Online (Sandbox Code Playgroud)

然后在任务中:

@task
def mytask(arg):
    arg = booleanize(arg)
Run Code Online (Sandbox Code Playgroud)


Ari*_*Ari 5

如果有问题的func使用"if argN:"而不是"if argN为True:"来测试布尔值是否为true,则可以使用""表示False,使用"anything"表示True.

另见:http://docs.python.org/library/stdtypes.html#truth-value-testing


j-a*_*j-a 5

如果你在所有任务中一致地使用模式('false','true'是布尔值),你可以只包装结构任务并将其应用于所有任务

你可以使用这个包(由我编写):https://pypi.python.org/pypi/boolfab/

这是(基本上)来源:

from fabric.api import task as _task

def fix_boolean(f):
    def fix_bool(value):
        if isinstance(value, basestring):
            if value.lower() == 'false':
                return False
            if value.lower() == 'true':
                return True
        return value

    @wraps(f)
    def wrapper(*args, **kwargs):
        args_ = [fix_bool(arg) for arg in args]
        kwargs_ = {k: fix_bool(v) for k,v in kwargs.iteritems()}
        return f(*args_, **kwargs_)

    return wrapper


def task(f):
    return _task(fix_boolean(f))
Run Code Online (Sandbox Code Playgroud)

这样就变成了:

@task
def my_task(flag_a, flag_b, flag_c)
   if flag_a:
       ....
Run Code Online (Sandbox Code Playgroud)

没有使用'booleanizing'args污染每个任务.


Cra*_*tro -3

正如结构文档中提到的,所有参数最终都作为字符串。这里要做的最简单的事情就是检查参数:

def myfunc(arg1, arg2):
  arg1 = (arg1 == 'True')
Run Code Online (Sandbox Code Playgroud)

括号不是必需的,但有助于提高可读性。

编辑:显然我并没有真正尝试过我之前的答案;更新。(两年后。)

  • 正如之前的评论所述,这个答案不能被接受,因为它不起作用,或者至少具有误导性。对于任何字符串,bool 结果都将为 True (4认同)