Transcrypt:将客户端 JS 对象转换为字典?
Transcrypt: Cast a client-side JS Object as a dict?
我有一个 class 定义,其开头如下所示。
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 什么不是。我想保持验证不变,因为相同的代码在服务器端很有用。
正确的处理方法是什么?
问题是 JS 对象本质上没有完整的指令,它们缺少一些方法。
但是它们可以通过 dict ()
构造函数转换为字典。
这非常快,因为没有复制数据,只更改原型以包含所需的 dict 方法。
isinstance
方法当然可以在 isinstance (<anyJsObject>, dict)
上更改为 return 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 对象,然后通过调用字典构造函数将其转换为字典。
我有一个 class 定义,其开头如下所示。
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 什么不是。我想保持验证不变,因为相同的代码在服务器端很有用。
正确的处理方法是什么?
问题是 JS 对象本质上没有完整的指令,它们缺少一些方法。
但是它们可以通过 dict ()
构造函数转换为字典。
这非常快,因为没有复制数据,只更改原型以包含所需的 dict 方法。
isinstance
方法当然可以在 isinstance (<anyJsObject>, dict)
上更改为 return 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 对象,然后通过调用字典构造函数将其转换为字典。