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 对象,然后通过调用字典构造函数将其转换为字典。