我有一个类定义,如下所示。
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以及什么不是非常直接。我希望保持验证,因为相同的代码在服务器端很有用。
处理此问题的正确方法是什么?
答案 0 :(得分:4)
问题是JS对象本质上没有完整的说法,他们错过了许多方法。
但它们可以由dict ()
构造函数转换为dicts。
这非常快,因为没有复制数据,只更改了原型以包含所需的dict方法。
当然可以修改isinstance
方法,以便在isinstance (<anyJsObject>, dict)
上返回True。
但这样就无法区分字典和对象。
因此可以调用对象没有的方法。
这超出了类型检查的目的。
由于您希望保持服务器和客户端上的代码完全相同,因此您可以在调用之前将register_list
中的JS对象转换为dict。
但是检查不再有意义了(至少在客户端上),因为在这种情况下,register_list
的所有元素确实都是必然的。
所以,或者,你可以省略支票,但你说你想保留验证。
更精确的替代方法是使用相同的源代码,但对Transcrypt进行一种检查,对CPython进行另一种检查:
from org.transcrypt.stubs.browser import __envir__
if __envir__.executor_name == __envir__.transpiler_name:
<do Transcrypt validation and, possibly, conversion, or nothing at all>
else:
<do CPython validation>
你可以,例如在Transcrypt中检查某些东西是否为JS对象,然后通过调用它的dict构造函数将其转换为dict。