如何在不创建元组元组的情况下创建包含任何时间变量的简单元组?例如,函数可以接受int
或tuple
int
个a = tuple(a)
。在函数内部,我想确保变量实际上是一个元组。
到目前为止我能想到
a = (a,)
和
a
但是,如果tuple
不可迭代,则第一个不起作用,如果tuple
已经是a
,则第二个不会创建((1,2),)
{/ 1}}。
{{1}}
我觉得我应该能够在不先检查类型的情况下做到这一点......我缺少什么?
答案 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()内部完成还是由调用函数完成,它仍然必须完成。