如何使我的命名元组引发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)
´´´
typing
模块实现类型提示,如PEP 484中所定义。类型提示正是名称所暗示的......它们是“提示”。它们不会影响Python代码的执行。根据PEP 484文件:
虽然这些注释在运行时通过常用的注释属性可用,但在运行时不会进行类型检查。相反,该提议假定存在一个单独的离线类型检查器,用户可以自动运行其源代码。从本质上讲,这种类型的检查器就像一个非常强大的linter。
因此,您需要一些额外的代码或工具来使用您添加到代码中的类型信息,以便事先告诉您代码违反类型提示,或者在代码运行时告诉您。 typing
模块本身不提供此功能。
我把你的代码放在我的PyCharm IDE中,并且IDE标记你传递给构造函数的字符串参数,因为它违反了类型提示,声明:“预期类型'int',而不是'str'。”所以PyCharm IDE是一个使用类型提示的工具。但是,PyCharm非常乐意运行代码,不会产生任何错误。
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。