通过键入创建NamedTuple时引发TypeError

时间:2019-04-26 01:58:23

标签: python typing namedtuple

如何使我的命名元组引发TypeError异常?

from typing import NamedTuple

class Foo(NamedTuple):

    bar : int     
    sla : str

但是,当我尝试使用无效类型创建namedtuple实例时,不会引发异常

test = Foo('not an int',3)

#i can even print it

print(test.bar)
´´´

2 个答案:

答案 0 :(得分:1)

typing模块实现类型提示,如 PEP 484 中所定义。类型提示正是名称所暗示的含义……它们是“提示”。它们不会自行影响Python代码的执行。根据PEP 484文件:

  

虽然这些注释在运行时可以通过通常的方式使用   注释属性,运行时不会进行类型检查。相反,该提案假定存在单独的离线   类型检查器,用户可以自愿运行其源代码。   本质上,这种类型检查器可以充当非常强大的linter。

因此,您需要一些其他代码或工具来利用已添加到代码中的类型信息,以预先告诉您代码违反类型提示,或者在代码运行时告诉您。 typing模块本身不提供此功能。

我将您的代码放在PyCharm IDE中,并且IDE将您传递给构造函数的字符串参数标记为违反类型提示,并指出:“预期类型为'int',得到了'str'代替”。。因此,PyCharm IDE就是这样一种利用类型提示的工具。但是,PyCharm非常乐于运行代码,并且不会产生任何错误。

答案 1 :(得分:0)

from typing import NamedTuple


class Foo(NamedTuple):
    bar: int
    sla: str

    def check_type(self):
        for field, field_type in self._field_types.items():
            if not isinstance(getattr(self, field), field_type):
                raise TypeError('{} must be {}'.format(field, field_type))
        return self


if __name__ == '__main__':
    test = Foo('not an int', 3).check_type()
    print(test.bar)

您可以添加其他检查方法。上面的代码在不匹配时会引发TypeError。