gpt4 book ai didi

python - 使用 issubclass 测试类型返回不一致的结果

转载 作者:行者123 更新时间:2023-12-04 16:45:43 26 4
gpt4 key购买 nike

我有一个 class A没有属性,我测试它是否是 typing.Container 的子类.正如预期的那样,该测试失败了。
在单独的测试中,我添加了 __contains(self, k)__属性到 A,并测试它是否是 typing.Container 的子类,并且测试通过。
现在奇怪的是,如果我测试是否 Atyping.Conainer 的子类,然后添加 __contains(self, k)__属性,然后再次测试是否Atyping.Container 的子类,该测试失败。
发生了什么导致最后一次测试失败,即使 A确实有属性 __contains__(self, k)__ ?

import pytest
from typing import Container

@pytest.fixture
def A():
class A:...
return A

def test_notsubclass(A):
# passes
assert not issubclass(A, Container)

def test_addcontains(A):
# passes
def __contains__(self, k): ...
setattr(A, '__contains__', __contains__)
assert issubclass(A, Container)

def test_first_then_add_contains(A):
# passes
assert not issubclass(A, Container)
def __contains__(self, k): ...
setattr(A, '__contains__', __contains__)

# fails
assert issubclass(A, Container)

最佳答案

许多 typing 的运行时表示类型是对应的包装器 collections.abc类型。 For example, typing.Container is a generic "alias" of collections.abc.Container :

Container = _alias(collections.abc.Container, 1)
顾名思义, collections.abc成员来自 abc.ABC/ abc.ABCMeta .由于 ABC 子类/实例检查可能很昂贵, abc.ABCMeta has an optimisation to cache subclass checks .

关于python - 使用 issubclass 测试类型返回不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68237766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com