Transcrypt:将客户端JS对象转换为字典?

时间:2017-04-28 12:57:33

标签: python transcrypt

我有一个类定义,如下所示。

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以及什么不是非常直接。我希望保持验证,因为相同的代码在服务器端很有用。

处理此问题的正确方法是什么?

1 个答案:

答案 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。