将非可迭代对象传递给list.extend()
我正在创建一个公共方法,允许用户向设备写入值,比如叫它 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 提出的那样,使用可变参数会更好,但我还是把这个答案留着,以便完整说明。有时候你不能使用可变参数。