Python 将不可数传递给list.extend()
我正在创建一个公共方法,允许调用者将值写入设备,例如,将其称为write_vals() 由于这些值将是实时键入的,因此我希望通过允许用户键入列表或单个值来简化用户的生活,具体取决于他们需要写入的值的数量。例如:Python 将不可数传递给list.extend(),python,list,Python,List,我正在创建一个公共方法,允许调用者将值写入设备,例如,将其称为write_vals() 由于这些值将是实时键入的,因此我希望通过允许用户键入列表或单个值来简化用户的生活,具体取决于他们需要写入的值的数量。例如: write_to_device([1,2,3]) 或 我的函数希望使用一个平面列表,因此我尝试聪明地编写如下代码: input_list = [] input_list.extend( input_val ) 当用户输入一个列表时,它工作得很顺利,但当用户输入一个整数时,它失败得
write_to_device([1,2,3])
或
我的函数希望使用一个平面列表,因此我尝试聪明地编写如下代码:
input_list = []
input_list.extend( input_val )
当用户输入一个列表时,它工作得很顺利,但当用户输入一个整数时,它失败得很惨:
TypeError:“int”对象不可编辑
使用list.append()将在传入列表时创建一个嵌套列表,这将是扁平化的额外麻烦
检查传入的对象的类型似乎很笨拙,也不是pythonic,希望list.extend()能够接受非iterables对我来说毫无意义。尝试各种其他编码方法也是如此
建议(请仅编码相关)将不胜感激。您可以检查传递的参数是否是带有函数的列表 更好的解决方案是支持数量可变的参数:
def write_to_device(*args):
# |args| is now a list of all the arguments given to the function
input_list.extend(args)
def write_to_device(*args):
print args
这样,即使不必将多个值显式指定为列表,也可以为函数指定多个值:
write_to_device(1)
write_to_device(1,2,3)
您可以使用
尝试…除了…
:
try:
input_list = list(input_val)
except TypeError:
input_list = list((input_val,))
这是蟒蛇式的
注:可变参数,如,更好,但为了完整起见,我留下这个答案。有时不能使用可变参数 可以使用try,而不是检查类型。尽管如此,我还是很想知道比我更精通python的人是如何做到这一点的
input_list = []
try:
input_list.extend(input_val)
except TypeError:
input_list.append(input_val)
从错误检查的角度来看,这似乎是不完整的,但如果您知道用户只会输入一个值或一个列表,这将起作用。有几种方法可以做到这一点,您可以根据需要选择哪种方法 您可以尝试将参数转换为列表,并假设如果它不起作用,则应将其解释为单个参数:
def write_to_device(args):
try:
args = list(args)
except TypeError:
args = [args]
print args
>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['a', 'b', 'c']
这很好,但如果将字符串作为参数传递,则可能会遇到问题:
def write_to_device(args):
try:
args = list(args)
except TypeError:
args = [args]
print args
>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['a', 'b', 'c']
您可以通过使用isinstance
检查参数是否为字符串来更正此错误:
def write_to_device(args):
if isinstance(args, basestring):
args = [args]
else:
try:
args = list(args)
except TypeError:
args = [args]
print args
这给了你:
>>> write_to_device(1)
[1]
>>> write_to_device([1,2])
[1, 2]
>>> write_to_device('abc')
['abc']
正如有人指出的,您可以允许函数接受任意数量的参数:
def write_to_device(*args):
# |args| is now a list of all the arguments given to the function
input_list.extend(args)
def write_to_device(*args):
print args
这让你:
>>> write_to_device(1)
(1,)
>>> write_to_device([1,2])
([1, 2],)
>>> write_to_device('abc')
('abc',)
>>> write_to_device(*[1,2])
(1, 2)
我推荐的方法只是要求将列表传递给函数:
write_to_device([1])
write_to_device([1, 2, 3])
这是简单、直截了当、毫不含糊的。基于之前的内容,我创建了以下内容:
def add2list(l,*args): l.extend(args)
# behaves like .extend, gets round issues of iterability
# so simple, so powerful!
例如:
answer = 42
mylist = []
add2list(mylist,1)
add2list(mylist,2,3,'a','b','c',answer)
print mylist
结果:[1,2,3,'a',b',c',42]当您说用户键入列表或单个值时,这是否意味着您正在以单个字符串的形式接收他们的输入?然后,您是否必须将其解析为逗号?如果您想传递一个列表以写入设备,您可以使用*:write_to_device(*mylist)write_to_device(*args)这样做,向用户表示不传递写入值是合法的,而在这种情况下则不合法。@JS:如果len(args)==0,您可以添加一个类似
的检查:raise TypeError('Missing arguments'))
@Zach感谢您的关注!我本来希望找到一个不那么冗长的解决方案,但这个很有效。我很喜欢你的“列表((输入值,)”技巧。非常感谢。如果将单个字符串传递给函数,如“abc”,则会中断。我喜欢您的第一个建议。干净优雅。用户将传入一个或多个十六进制值列表,因此,如果他们传入字符串,脚本就会爆炸,这只是甜点而已。;-)好,好。我将检查字符串并优雅地失败(抱怨):-)