创建元组(如果还没有)

时间:2014-04-29 11:10:40

标签: python tuples

如何在不创建元组元组的情况下创建包含任何时间变量的简单元组?例如,函数可以接受inttuple inta = tuple(a) 。在函数内部,我想确保变量实际上是一个元组。

到目前为止我能想到

a = (a,)

a

但是,如果tuple不可迭代,则第一个不起作用,如果tuple已经是a,则第二个不会创建((1,2),) {/ 1}}。

{{1}}

我觉得我应该能够在不先检查类型的情况下做到这一点......我缺少什么?

2 个答案:

答案 0 :(得分:2)

您可以使用异常处理;尝试在对象上调用iter(),例如

try:
    iter(a)
except TypeError:
    # not an iterable, assume a single value
    a = (a,)

如果你打算迭代元组来处理值,你只需存储iter()调用的输出并直接使用它:

try:
    a = iter(a)
except TypeError:
    a = (a,)

for elem in a:

您还可以使您的功能签名接受多个参数:

def foobar(*a):
    for elem in a:

现在a 总是一个元组,但要传递一个元组,你必须用它来调用它:

sometuple = (1, 2, 3)
foobar(*sometuple)

,而单个值传递为:

foobar(singlevalue)

答案 1 :(得分:0)

您可以使用lambda函数:

a = (lambda x: x if type(x) is tuple else (x,))(a)

也许比你想要的更冗长,但它允许你将它们全部保存在一行中。

不幸的是,如果不检查参数的类型,就没有办法做到这一点。当你尝试从另一个元组构造一个元组时 - 例如t =(tup,) - 它被视为一般的Python对象,即它不知道"知道"这是一个元组。为了使它自动扩展元组,它必须首先检查它的类型。

还必须识别不可迭代的对象,因为它不包含迭代它的元素的必要方法。换句话说,不可迭代 - 例如标量 - 不仅仅是具有单个元素的可迭代。它们是完全不同的对象类型。它可以放在元组中,但不能转换为元组。

当您使用元组函数创建元组时,它只是将输入视为通用迭代。它不知道它是一个元组。

因此,类型检查是由tuple()内部完成还是由调用函数完成,它仍然必须完成。