将非可迭代对象传递给list.extend()

5 投票
5 回答
5799 浏览
提问于 2025-04-15 21:18

我正在创建一个公共方法,允许用户向设备写入值,比如叫它 write_vals()。

因为这些值是实时输入的,我想让用户更方便,所以希望他们可以输入一个列表或者一个单独的值,这取决于他们需要写多少个值。例如:

write_to_device([1,2,3])

或者

write_to_device(1)

我的函数希望能处理一个简单的列表,所以我试着聪明地写了这样的代码:

input_list = []  
input_list.extend( input_val )

当用户输入一个列表时,这个方法运行得很好,但当用户输入一个单独的整数时,就出问题了:

类型错误:'int' 对象不可迭代

如果使用 list.append(),当传入一个列表时,会创建一个嵌套列表,这样又得额外处理一下才能扁平化。

检查传入对象的类型感觉很笨拙,也不符合 Python 的风格,而希望 list.extend() 能接受非可迭代对象也没有任何进展。尝试其他各种编码方法也是如此。

如果有建议(只限编码相关的),我会非常感激。

5 个回答

4

与其检查数据类型,不如用尝试和捕获的方式来处理。虽然我很好奇那些比我更懂Python的人会怎么做。

input_list = []
try:
    input_list.extend(input_val)
except TypeError:
    input_list.append(input_val)

从错误检查的角度来看,这似乎不太完整,但如果你确定用户只会输入一个值或者一个列表,这样做是可以的。

10

你可以使用 isinstance() 这个函数来检查传入的参数是否是一个列表。

还有一个更好的方法是支持可变数量的参数:

def write_to_device(*args):
   # |args| is now a list of all the arguments given to the function
   input_list.extend(args)

这样的话,即使不把多个值明确地放在一个列表里,也可以直接传给这个函数:

write_to_device(1)
write_to_device(1,2,3)
4

你可以使用 try...except... 这种方式:

try:
    input_list = list(input_val)
except TypeError:
    input_list = list((input_val,))

这是一种很符合Python风格的写法。

补充说明:像 @sth 提出的那样,使用可变参数会更好,但我还是把这个答案留着,以便完整说明。有时候你不能使用可变参数。

撰写回答