如何将 bool 的字符串表示解析为 python 中的 bool?

How to parse string representations of bool into bool in python?

我需要的场景:

  1. 用户输入True或False,默认解析为str。我无法更改解析类型,因为 python 3+ 解析为 str(使用 Python 3.8) 因此,当我解析 bool(input('Enter True or False')) 时,它 returns True 不管因为默认的 bool 函数只有 returns False 当有一个空字符串时。 True 否则。

  2. 我有一个 json 需要它。

它有如下表示:

list_of_visits ='''{"Museum": "True",
"Library": "True",
"Park": "False"}
'''

请注意,如果没有 qoutes,我不能将其表示为:

list_of_visits ='''{"Museum": True,
"Library": True,
"Park": False}
'''

原因解析如下抛出错误:

jsonic = json.loads(list_of_visits)
jsonic

但是我在某些地方还需要从 int 和 float 进行解析,我不能为每种类型分别编写函数。 我正在尝试构建一个一站式解决方案,它可能会继承 bool() 的功能并进行这种转换,我可以在任何地方使用它 即解决方案不仅可以执行传统的 bool() 操作,还可以解析字符串表示形式。

目前我执行以下步骤:

if type(value) == str and value =='True':
    reprs = True
elif type(value) == str and value =='False':
    reprs = False
else:
    reprs = bool(value)

您可以定义自己的函数,它可以在所有情况下工作:

def get_bool(key):
    return value if value := {'True':True, 'False':False}.get(key) else bool(key)
    

对于单个值,例如输入,您可以将其解析为:

get_bool('False')

哪个returns:False

对于像这样的 json,您可能会这样做:

from toolz.dicttoolz import valmap
valmap(get_bool, jsonic)

哪个returns:

{'Museum': 1, 'Library': 1, 'Park': 0}
    

对于 3.7 及更低版本:

我爱上了 walrus 运算符,因为它出现在 python 3.8 中。任何寻找较低版本的人可能需要一些重复:

def get_bool(key):
return {'True':True, 'False':False}.get(key) if  key.title() in {'True':True, 'False':False}.keys() else bool(key)

请注意,虽然它适用于所有情况,但您的 JSON 表示是错误的。 JSONs 可以有布尔值,JSONs 的字符串表示也可以。但是你必须使用 javascript 语法作为 truefalse 而不是 Python 的 TrueFalse。因为 JSON 是 javascript 符号。