Python 用变量连接元组

Python 用变量连接元组,python,tuples,concatenation,Python,Tuples,Concatenation,我有一个元组x=(2,),我想在其中附加一个变量y。我事先不知道确切的变量y是什么类型 y可以是: 一个元组,在这种情况下我很乐意使用x+y,或者 单个对象(通常是字符串或int),在这种情况下,我应该使用x+(y,) 采用一种策略会在一半时间内给我一个TypeError,而采用另一种策略会在我需要时给我(2,(3,4)) 处理此问题的最佳方法是什么?在if条件下使用 >>> x = (2,) >>> y1 = (1,2) >>> y2

我有一个元组
x=(2,)
,我想在其中附加一个变量
y
。我事先不知道确切的变量
y
是什么类型

y
可以是:

  • 一个元组,在这种情况下我很乐意使用
    x+y
    ,或者
  • 单个对象(通常是字符串或int),在这种情况下,我应该使用
    x+(y,)
采用一种策略会在一半时间内给我一个TypeError,而采用另一种策略会在我需要时给我
(2,(3,4))

处理此问题的最佳方法是什么?

if
条件下使用

>>> 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)
>>> 

使用第二种策略,只需检查是添加包含多个项的iterable还是添加单个项

通过检查是否存在
\uu iter\uuuu
属性,可以查看对象是否为iterable(
元组
列表
,等等)。例如:

# 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,)
试试这个。这个片段的行为将与您在问题中描述的完全相同

请注意,在Python3中,字符串有一个
\uuuu iter\uuu
方法。在Python 2.7中:

>>> hasattr("abc", "__iter__")
False
在Python 3+中:

>>> hasattr("abc","__iter__")
True

如果您使用的是Python 3(您在问题中没有提到),请将
hasattr(y,“\uu iter\uu”)
替换为
hasattr(y,“\uu iter\uuu”),而不是isinstance(y,str)
。这仍然会考虑元组或列表

首先,元组是不可变的,所以您正在创建一个新对象。另一方面,您可以捕获错误并尝试另一种方法。有时需要附加元组,有时需要附加标量,这让我很困扰。在python中,唯一可以获得不同类型值的有效场景是在模拟函数重载时。在这种情况下,检查
type(y)=tuple
isinstance(y,tuple)
isinstance(y,collections.Iterable)
谢谢Jon,我的语言有点松散,它确实是一个新对象。就塔马斯的观点而言,我正在一个可以在多个集合上建立索引的框架内处理对象。当我迭代在单个集合上定义的对象时,我会得到单个项索引,但是如果我迭代在多个集合上定义的对象,那么我会得到元组。如果y是列表,这不起作用。请看我的答案,它对于任何可能附加到元组的iterable类型都更为健壮。@Luke,有人提到,
y
只能是元组、int或字符串。OP只提到元组是iterable,我只是假设他指的是包含多个项的iterable。他没有指定唯一的“单对象”类型可以是string或int:“单个对象(通常是string或int)”注意,
str
也有
\uuuuuuu iter\uuu
作为属性。因此,使用
x
as
(2)
y
as
'hi'
,输出将是
(2,'h','i')
@LukeTaylor,正如塔马斯在对这个问题的评论中提到的那样-可移植和python方法不是检查dunder方法的存在,而是使用
isinstance(y,collections.Iterable)
…编辑以注意Python 2与Python 3的区别。@LukeTaylor我更喜欢使用保证工作的工具,这些工具不需要了解实现细节,跨版本工作,也不需要解释为什么它在一种情况下工作,但在另一种情况下不工作:预归档更新-不要忘记类似文件的对象,集合和dict也是可写的,数组、ByteArray、字节等也是可写的使用特殊大小写字符串比将所有其他类型对象(其iterable状态是理想的)列入白名单要容易得多