parser.parse_args 布尔值解析 "False" 为 True

parser.parse_args boolean parse "False" as True

当我 运行 使用 -rm False 我的 python 代码时,我仍然看到 _REMOVE_ADS = True

我该如何解决这个问题?

parser.add_argument(
    "-rm",
    "--remove_ads",
    type=bool,
    required=False,
    default=False,
    help="Should remove disapproved ads. Default: false",
)
# TODO: Fix booleans
args = parser.parse_args()
_REMOVE_ADS = args.remove_ads
print(_REMOVE_ADS)

这是因为它们被解析为字符串,任何非空字符串都被 bool 视为 True:

>>> bool("False")
True

要修复它,请使用不同的类型而不是 type=bool,因为 Python < 3.10 有 a standard lib option which can be used:

from distutils.util import strtobool

您可以在解析器实例上使用名称注册此类型:

from distutils.util import strtobool

parser = ArgumentParser(...)
parser.register('type', 'boolean', strtobool)
parser.add_argument('-rm', type='boolean')

或者,只需将此选项设置为一个标志,这样它就不需要接受任何参数,但请注意,这确实会改变您的 CLI 使用语法:

parser.add_argument(
    "-rm", "--remove-ads",
    action="store_true",
    help="Should remove disapproved ads",
)

在 Python 3.10 中,PEP-632 的 distutils module has been deprecated. The Migration Advice 部分表示 strtobool 函数没有替代品,您需要自己重新实现该功能,但是应该足够简单(根据需要进行调整):

def strtobool(val): 
    if val.lower().startswith("t"): 
        return True 
    elif val.lower().startswith("f"): 
        return False 
    raise argparse.ArgumentTypeError("invalid boolean value: {!r}".format(val))