【发布时间】:2022-01-10 21:00:30
【问题描述】:
假设我生成了一个字符串列表:
def printList(list)
for i in list:
print(i)
string = 'hello,world,!'
strings = string.split(',')
printList(strings)
这很好用。但是,如果字符串只有一个元素长,或者我想使用不可迭代的类型调用 printList,那么这将分崩离析。考虑以下(更相关的)示例:
my_list=[]
def add_items_filtered(items)
for item in items:
if item > 5: #arbitrary filter
my_list.append(item)
add_items_filtered([4,5,6,7]) #this works fine
add_items_filtered(6) #this fails
这里的问题是我发送的项目不是“可迭代的”。我可以解决这个问题:
if not isinstance(items, list):
items=[items]
但这似乎是一个 hack。通过强制此函数的调用者将我发送到列表中,这是唯一真正的方法吗?被这样一个简单的问题所阻碍似乎违反直觉。
【问题讨论】:
-
如果你给它一些不是列表的东西,那么函数的预期返回值是多少。比如
add_items_filtered(some_non_iterable),你希望函数在这种情况下返回什么? -
不,这不是 hack。事实上,这就是类型系统在大多数编程语言中的工作方式。
-
您实际上想要完成什么?比如,你会在什么情况下使用这个函数?这似乎是一个XY problem,因为在向量(列表)上工作的函数接受标量(int)并没有真正意义。也许您想改用
*args? -
try-except 也是另一种解决方案。
-
此函数的目的是将传入的任何内容添加到列表中(在应用过滤器之后)。我希望调用者能够转储到要添加的对象列表中,而不必自己循环并顺序调用 add 函数