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))
当我 运行 使用 -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))