6

认为,

var = ('x', 3)

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

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

7 回答 7

8

这是一个简单的单行:

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
于 2015-09-24T22:36:10.950 回答
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
于 2015-09-24T21:11:28.923 回答
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

于 2015-09-24T20:59:23.690 回答
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

于 2015-09-24T21:04:12.220 回答
0

您可以将所有 if 链接在一行上:

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

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

于 2015-09-24T20:59:37.727 回答
-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 使用短路逻辑。如果它不是元组,则不会执行第二个和第三个测试,因此您不会在尝试索引不可索引的变量时崩溃。但很可能,有人从 Tuple 派生了一个类并对其进行了修改,使其索引不是整数或其他一些奇怪的东西。

顺便说一句,您还应该检查 len(var)==2 吗?

于 2015-09-24T21:12:31.163 回答
-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
于 2015-09-24T21:14:48.737 回答