Transcrypt:将clientside JS对象转换为dict?

2024-04-18 18:10:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的类定义。你知道吗

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的定义非常直白。我希望保持验证的原样,因为相同的代码在服务器端很有用。你知道吗

正确的处理方法是什么?你知道吗


Tags: inselfregisterforif定义requirednot
1条回答
网友
1楼 · 发布于 2024-04-18 18:10:18

问题是JS对象本质上不是完整的dict,它们缺少很多方法。 但是它们可以通过dict ()构造函数转换为dict。 这是非常快的,因为没有数据被复制,只有原型被更改为包含所需的dict方法。你知道吗

当然isinstance方法可以更改为在isinstance (<anyJsObject>, dict)上返回True。 但这就不可能区分dict和object。 因此可以调用对象没有的方法。 这超出了打字检查的目的。你知道吗

因为您希望保持服务器和客户机上的代码相同,所以可以在调用之前将register_list中的JS对象转换为dict。你知道吗

但是检查将不再有意义(至少在客户机上),因为在这种情况下register_list的所有元素肯定都是dicts。你知道吗

所以,或者,你可以省略检查,但你说你想保留验证。你知道吗

更精确的替代方法是使用相同的源代码,但对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。你知道吗

相关问题 更多 >