总之,如果我有:
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
的任何广泛的文档。我错过了什么吗?)
或者可能有更好的解决方案。那么,什么是最符合Pythonic(或者根据一般原则是最好的)的解决方法呢?(让我们只假设内置类型,但如果解决方案更改为自定义类型,那么为了完整性,最好包含它。)
我认为最好的解决方案是建立一个与类型对应的字符串值的字典。然后我们可以使用构建一个简单的函数来检查它
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]