认为,
var = ('x', 3)
如何检查一个变量是否是一个只有两个元素的元组,第一个是 str 类型,另一个是 python 中的 int 类型?我们可以只使用一张支票来做到这一点吗?我想避免这种情况-
if isinstance(var, tuple):
if isinstance (var[0], str) and (var[1], int):
return True
return False
认为,
var = ('x', 3)
如何检查一个变量是否是一个只有两个元素的元组,第一个是 str 类型,另一个是 python 中的 int 类型?我们可以只使用一张支票来做到这一点吗?我想避免这种情况-
if isinstance(var, tuple):
if isinstance (var[0], str) and (var[1], int):
return True
return False
这是一个简单的单行:
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
不完全符合您的要求,但您可能会发现它很有用。
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
考虑到元组的长度是可变的,你不会找到一种方法来检查这个实例的所有类型。你的方法有什么问题?很清楚它的作用并且适合您的使用。你不会找到一个漂亮的班轮 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!
您可以将参数元组传递给 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
您可以将所有 if 链接在一行上:
result = isinstance(var, tuple) and isinstance(var[0], str) and isinstance(var[1], int)
result
将是 True 是所有条件都匹配,否则它将是 False
你可以走乞求宽恕的路线:
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 吗?
您可以编写自己的函数来检查变量是否与规范匹配:
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