gpt4 book ai didi

Python:检查两个变量之间相同类型的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:08 31 4
gpt4 key购买 nike

我想检查两个变量在 python 3.x 中是否属于同一类型。执行此操作的最理想方法是什么?

举个例子:

class A():
def __init__(self, x):
self.x = x

class B(A):
def __init__(self, x):
x += 5
super(B, self).__init__(x)

理想情况下,如果将 AB 类型的两个变量相互比较,我希望返回 True。以下是一些不起作用的潜在解决方案:

>>> a = A(5)
>>> b = B(5)
>>>
>>> type(a) is type(b)
False
>>> isinstance(a, type(b))
False
>>> isinstance(b, type(a))
True

最后一个并不理想,因为如中间示例所示,如果要检查的类型是变量类型的子类,则返回 False

我尝试过的唯一可以涵盖所有基础的解决方案是:

>>> isinstance(a, type(b)) or isinstance(b, type(a))
True

有没有更好的办法?

最佳答案

该程序遍历提供的对象的所有__base__ 并检查它们之间的公共(public)交集(无object):

class A:
def __init__(self, x):
self.x = x

class B(A):
def __init__(self, x):
x += 5
super(B, self).__init__(x)

class C(B):
def __init__(self, x):
self.x = x

class D:
def __init__(self, x):
self.x = x

class E(C, B):
def __init__(self, x):
self.x = x

a = A(5)
b = B(5)
c = C(5)
d = D(5)
e = E(5)

def check(*objs):
def _all_bases(o):
for b in o.__bases__:
if b is not object:
yield b
yield from _all_bases(b)
s = [(i.__class__, *_all_bases(i.__class__)) for i in objs]
return len(set(*s[:1]).intersection(*s[1:])) > 0

print(check(a, b)) # True
print(check(a, c)) # True
print(check(a, d)) # False
print(check(a, e)) # True
print(check(b, c)) # True
print(check(b, d)) # False
print(check(b, e)) # True
print(check(e, d)) # False
print(check(a, b, c)) # True
print(check(a, b, c, e)) # True
print(check(a, b, c, d)) # False
print(check('string1', 'string2')) # True

关于Python:检查两个变量之间相同类型的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957121/

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