如何检查特定类型的元组或列表?

时间:2015-09-24 20:53:05

标签: python types tuples isinstance

假设,

var = ('x', 3)

如何检查变量是否只是一个元组,只有两个元素,首先是str类型,另一个是python中的int类型? 我们可以只使用一张支票吗? 我想避免这个 -

if isinstance(var, tuple):
    if isinstance (var[0], str) and (var[1], int):
         return True
return False

7 个答案:

答案 0 :(得分:3)

这是一个简单的单行:

isinstance(v, tuple) and list(map(type, v)) == [str, int]

尝试一下:

>>> def check(v):
        return isinstance(v, tuple) and list(map(type, v)) == [str, int]
...
>>> check(0)
False
>>> check(('x', 3, 4))
False
>>> check((3, 4))
False
>>> check(['x', 3])
False
>>> check(('x', 3))
True

答案 1 :(得分:1)

考虑到元组的长度是可变的,你不会找到一个检查所有类型的实例的方法。你有什么方法有什么问题?很清楚它的作用,它适合您的使用。你不会找到漂亮的衬垫AFAIK。

你确实有一个班轮......技术上:

def isMyTuple(my_tuple):
    return isinstance(my_tuple,(tuple, list)) and isinstance(my_tuple[0],str) and isinstance(my_tuple[1],int)

var = ('x', 3)

print isMyTuple(var)

如果您要多次进行此检查,请调用该方法为DRY

答案 2 :(得分:1)

不完全符合您的要求,但您可能会发现它很有用。

from itertools import izip_longest


def typemap(iterable, types, *indexes):
    # izip_longest helps with the length check, because we will get a TypeError if len(iterable) > len(types)
    try:
        _iterable = ((elem for ind, elem in enumerate(iterable)
                     if ind in indexes) if indexes else iterable)
        return all(isinstance(elem, _type)
                   for elem, _type in izip_longest(_iterable, types))
    except TypeError:
        return False

typemap((1, 2, "ch", {}, []), (int, int, str, dict, list)) # -> True
typemap((1, 2, "ch", {}, []), (int, int, str, dict)) # -> False
typemap((1, 2, "ch", {}, []), (int, int, str, list), 0, 1, 2, 4) # -> True

答案 3 :(得分:0)

您可以将所有ifs链接到一行:

result = isinstance(var, tuple) and isinstance(var[0], str) and isinstance(var[1], int)

result将为True,所有条件都匹配,否则它将为False

答案 4 :(得分:0)

您可以将一个参数元组传递给isinstance来测试列表或元组:

def test(t):
    return  isinstance(t, (tuple, list))and len(t) == 2 and\
        isinstance(t[0], str) and isinstance(t[1], int)

如果你只想接受带有两个元素的列表或元组,你需要检查长度,如果它不必是2,你仍然需要确保它至少有两个元素来避免indexError < / p>

答案 5 :(得分:-1)

你可以沿着乞求宽恕的道路前进:

def isMyTuple( var):
    try:
        return isinstance(var, tuple) and \
               isinstance (var[0], str) and \
               isinstance(var[1], int)
    except:
        return False

我不完全确定在这种情况下您需要try ... except。 Python使用短循环逻辑。如果它不是一个元组,则第二个和第三个测试不会被执行,因此您不会因为尝试索引不可索引的var而崩溃。但只是可能,有人从Tuple派生了一个类并对其进行了修改,使其索引不是整数,或者是其他一些奇怪的东西。

BTW你应该还检查len(var)== 2?

答案 6 :(得分:-1)

您可以编写自己的函数来检查变量是否与规范匹配:

def istype(var, spec):
    if type(var) != type(spec):
        return False
    if isinstance(spec, tuple):
        if len(var) != len(spec):
            return False
        return all([istype(var[i], spec[i]) for i in range(len(var))])
    return True

您必须为其他类型添加更多检查,但对于您的示例,这就足够了。

>>> istype((1,'x'), (2,'y'))
True