Python argparse 处理布尔值

问题描述 投票:0回答:1

标题很模糊,但我不知道如何简洁地表达我的问题。

我想在我的脚本中添加一个标志,该标志将接受布尔值,或者如果未提供布尔值,则默认为 True。该部分很简单,但如果用户未提供该标志(例如“无”),我也希望它保存一个单独的值。本质上持有三种不同的价值观。

import argparse

parser = argparse.ArgumentParser()

######
## prefered method
######
def t_or_f(arg):
    arg_str = str(arg)
    print(f"evaluating {arg_str}")
    if arg_str == "None":
        return True
    if arg_str.lower() == "true":
        return True
    if arg_str.lower() == "false":
        return False

parser.add_argument(
    "--follow-lib",
    type=t_or_f,
    nargs='?',
)

args, leftover = parser.parse_known_args()

print(args.follow_lib)

这段代码接近我想要实现的目标,但是“python scipt.py --follow-lib”给了我 None ,我希望它是 True 。当没有给标志赋予值时,它不会运行 t_or_f() 函数。

我知道实现这一点的Python方法是使用两个标志,例如:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument(
    "--follow-lib",
    action='store_true',
    default=None
)
parser.add_argument(
    '--no-follow-lib',
    action='store_false',
    dest='follow_lib'
)

args, leftover = parser.parse_known_args()

print(args.follow_lib)

上面的代码实现了我在脚本中想要的内容,但如果可以避免的话,我不想使用两个标志。有没有一种方法可以只用一个标志来获得相同的结果?

最终我想要以下行为:

python script.py
-> 无

python script.py --follow-lib
-> 正确

python script.py --follow-lib=True
-> 正确

python script.py --follow-lib=False
-> 错误

谢谢

python argparse
1个回答
0
投票

如果不传递任何参数,该函数将永远不会被调用。

不确定这样的东西是否是您正在寻找的

import argparse

parser = argparse.ArgumentParser()


######
## prefered method
######
parser.add_argument(
    "--follow-lib",
    default=True,
    nargs='?',
)

args = parser.parse_args()
arg_str = str(args.follow_lib)

# If true or no argument provided enabled the flag and run some function
if arg_str.lower() == "true" or args.follow_lib is None:
  print("Flag Enabled")

# if flag is disable do nothing i guess
if arg_str.lower() == "false":
  print("Flag disabled")

args, leftover = parser.parse_known_args()

print(args.follow_lib)
© www.soinside.com 2019 - 2024. All rights reserved.