我有一个元组x = (2,)
,我想在其中添加一个变量y
。我事先并不知道究竟会有什么样的变量y
。
y
可能是:
x+y
或x+(y,)
。采用一种策略会在一半时间内给我一个TypeError,而当我想要(2, (3, 4))
时,采用另一种策略会给我(2, 3, 4)
。
处理此问题的最佳方式是什么?
答案 0 :(得分:4)
使用第二种策略,只需检查您是否添加了包含多个项目或单个项目的可迭代项。
通过检查是否存在tuple
属性,您可以查看对象是否是可迭代的(list
,__iter__
等)。例如:
# Checks whether the object is iterable, like a tuple or list, but not a string.
if hasattr(y, "__iter__"):
x += tuple(y)
# Otherwise, it must be a "single object" as you describe it.
else:
x += (y,)
试试这个。此代码段的行为与您在问题中描述的完全相同。
请注意,在Python 3中,字符串具有__iter__
方法。在Python 2.7中:
>>> hasattr("abc", "__iter__")
False
在Python 3 +中:
>>> hasattr("abc","__iter__")
True
如果您使用的是Python 3,在您的问题中没有提到,请将hasattr(y, "__iter__")
替换为hasattr(y, "__iter__") and not isinstance(y, str)
。这仍然会考虑元组或列表。
答案 1 :(得分:1)
在if
条件下使用isinstance
。
>>> x = (2,)
>>> y1 = (1,2)
>>> y2 = 2
>>> def concat_tups(x,y):
... return x + (y if isinstance(y,tuple) else (y,))
...
>>> concat_tups(x,y2)
(2, 2)
>>> concat_tups(x,y1)
(2, 1, 2)
>>>