json 根据Python中字符串给定的类型进行检查的正确方法

hmmo2u0o  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(119)

简而言之,如果我有:

str_type = "int"
to_check = 1

执行以下检查的最佳方法是什么?

if isinstance(to_check, str_type):
...

更详细:
我想使用一个JSON文件给出的类型信息来检查另一个JSON文件的值。
如果我有template.json

{
  "param1": "int",
  "param2": "bool"
}

以及with_values.json

{
  "param1": 2,
  "param2": True
}

我接下来要做这样的检查:

if isinstance(with_values["param1"], template["param1"]):
...

这段程式码会失败,因为isinstance()的第二个参数必须是型别对象,而不是提供的字串。
通过搜索,我看到了一些选项,例如:
使用字典从template.json转换“类型字符串”:

TYPES = {
  'int' : int,
  'str' : str,
...
}

if isinstance(with_values["param1"], TYPES[template["param1"]]):

或者使用eval(不建议使用,但在本例中足够安全?):

if isinstance(with_values["param1"], eval(template["param1"])):

或者我可以用原型值替换“类型字符串”:

{
  "param1": 0,
  "param2": True
}

if isinstance(with_values["param1"], type(template["param1"]): # or type() is/== type()

还有pydoc.locate,但是使用文档模块来实现这个目的似乎是不合适的。(而且,我找不到这个函数的参考,或者pydoc的任何扩展文档。我是否遗漏了什么?)
或者可能有更好的解决方案。那么,什么是处理这个问题的最简单(或者根据一般原则最好)的方法呢?(让我们假设只有内置类型,但是如果解决方案针对自定义类型而改变,那么为了完整性,最好包括这一点。)

bsxbgnwa

bsxbgnwa1#

我认为最好的解决方案是建立一个字典,其中的字符串值与类型相对应。然后我们可以使用build一个简单的函数来检查它

def check_types(value, expected_type: str):
    types = {
        "int": int,
        "str": str,
        "float": float
    }
    return isinstance(value, types[expected_type])

print(check_types(1, "int"))

如果你想专门检查类型而不是子类(例如布尔值表示为整数),使用下面的代码将返回布尔值是否为整数False

def check_types(value, expected_type: str):
    types = {
        "bool": bool,
        "int": int,
        "str": str,
        "float": float
    }
    return type(value) == types[expected_type]

相关问题