假设,
var = ('x', 3)
如何检查变量是否只是一个元组,只有两个元素,首先是str类型,另一个是python中的int类型? 我们可以只使用一张支票吗? 我想避免这个 -
if isinstance(var, tuple):
if isinstance (var[0], str) and (var[1], int):
return True
return False
答案 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