Python类强制类型暗示

2024-04-24 10:06:10 发布

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

所以我需要强制执行一个类变量的类型,但更重要的是,我需要强制执行一个包含其类型的列表。因此,如果我有一些代码如下所示:

class foo:
    def __init__(self, value: list[int]):
        self.value = value

顺便说一句,我使用的是python版本3.9.4

所以本质上我的问题是,如何确保这个值是一个整数列表

提前谢谢

  • 扎克

Tags: 代码self版本类型列表fooinitvalue
2条回答

除了类型检查(仅由linter强制执行)之外,您还可以assert

class foo:
    def __init__(self, value: list[int]):
        assert isinstance(value, list) and all(isinstance(i, int) for i in value)
        self.value = value

>>> foo([1,2,3])  # good
<__main__.foo object at 0x000001EB492A5940>

>>> foo('abc')  # bad
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    foo('abc')
  File "<pyshell#1>", line 3, in __init__
    assert isinstance(value, list) and all(isinstance(i, int) for i in value)
AssertionError

>>> foo([1.0, 2.0, 3.0])  # bad
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    foo([1.0, 2.0, 3.0])
  File "<pyshell#1>", line 3, in __init__
    assert isinstance(value, list) and all(isinstance(i, int) for i in value)
AssertionError

除了一个简单的断言之外,您还可以raise或者为调用方实现一个自定义异常来处理这些异常

一种方法是直接检查实例类型,如果它们不在您想要的类型中,则引发错误

class foo:
    def __init__(self, value):
        if not isinstance(value, list) or not all(isinstance(x, int) for x in value):
            raise TypeError("value should be a list of integers")
            
        self.value = value

相关问题 更多 >