我有一个如下所示的类定义。你知道吗
class Ace11():
def __init__(self, register_list):
"""
Parse and validate the list of dicts.
"""
self.required_keys = """
briefdescription defaultvalue flatname rnum rtype where
""".strip().split()
self.registers = register_list
## Validate
for d in self.registers:
if not isinstance(d, dict):
raise TypeError("{d} is not a dict.".format(**locals()))
for k in self.required_keys:
if not k in d.keys():
raise ValueError("Key {k} missing from {d}"
.format(**locals()))
当我试图用一个包含对象数组的var在客户端实例化它时,会引发TypeError,可能是因为isinstance对dict和非dict的定义非常直白。我希望保持验证的原样,因为相同的代码在服务器端很有用。你知道吗
正确的处理方法是什么?你知道吗
问题是JS对象本质上不是完整的dict,它们缺少很多方法。 但是它们可以通过
dict ()
构造函数转换为dict。 这是非常快的,因为没有数据被复制,只有原型被更改为包含所需的dict方法。你知道吗当然
isinstance
方法可以更改为在isinstance (<anyJsObject>, dict)
上返回True。 但这就不可能区分dict和object。 因此可以调用对象没有的方法。 这超出了打字检查的目的。你知道吗因为您希望保持服务器和客户机上的代码相同,所以可以在调用之前将
register_list
中的JS对象转换为dict。你知道吗但是检查将不再有意义(至少在客户机上),因为在这种情况下
register_list
的所有元素肯定都是dicts。你知道吗所以,或者,你可以省略检查,但你说你想保留验证。你知道吗
更精确的替代方法是使用相同的源代码,但对Transcrypt和CPython分别进行一种检查:
例如,您可以在Transcrypt中检查某个对象是否是JS对象,然后通过调用dict构造函数将其转换为dict。你知道吗
相关问题 更多 >
编程相关推荐