简而言之,如果我有:
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
的任何扩展文档。我是否遗漏了什么?)
或者可能有更好的解决方案。那么,什么是处理这个问题的最简单(或者根据一般原则最好)的方法呢?(让我们假设只有内置类型,但是如果解决方案针对自定义类型而改变,那么为了完整性,最好包括这一点。)
1条答案
按热度按时间bsxbgnwa1#
我认为最好的解决方案是建立一个字典,其中的字符串值与类型相对应。然后我们可以使用build一个简单的函数来检查它
如果你想专门检查类型而不是子类(例如布尔值表示为整数),使用下面的代码将返回布尔值是否为整数
False