Python 3.x 确保变量是一个列表
我经常发现自己的情况是,我有一个变量,它可能是或不是我想要迭代的项目列表。如果它不是一个列表,我会从中列出一个列表,这样我仍然可以遍历它。这样我就不必在循环中编写两次代码Python 3.x 确保变量是一个列表,python-3.x,list,Python 3.x,List,我经常发现自己的情况是,我有一个变量,它可能是或不是我想要迭代的项目列表。如果它不是一个列表,我会从中列出一个列表,这样我仍然可以遍历它。这样我就不必在循环中编写两次代码 def dispatch(stuff): if type(stuff) is list: stuff = [stuff] for item in stuff: # this could be several lines of code do_something_with(it
def dispatch(stuff):
if type(stuff) is list:
stuff = [stuff]
for item in stuff:
# this could be several lines of code
do_something_with(item)
我不喜欢的是(1)两个额外的行(2)通常不鼓励的类型检查(3)此外,我真的应该检查东西是否是一个iterable,因为它也可以是一个元组,但随后它就变了。关键是,我能想到的任何健壮的解决方案都涉及大量令人不快的样板代码
您无法通过在[stuff]中为项写入来确保stuff是一个列表,因为如果stuff已经是一个列表,它将生成一个嵌套列表,而不会迭代stuff中的项。您也不能对列表中的项(stuff)
执行,因为如果stuff不是iterable,则list的构造函数会抛出一个错误
所以我想问的问题是:ensurelist(stuff)
有什么明显的效果我没有注意到,如果没有,你能想一个为什么这种语言不容易访问这些功能的原因吗
编辑:
特别是,我想知道为什么列表(x)不允许x是不可编辑的,只返回一个包含x的列表作为单个项 以io
模块中定义的类为例,这些类提供了单独的write
和writelines
方法来编写单行和行列表。提供执行不同操作的单独功能。(一方甚至可以使用另一方。)
调用方可以更轻松地确定dispatch
或dispatch\u all
是否是要使用的正确函数,而do-it all函数则可以更轻松地确定是否需要迭代其参数。“您无法通过在[stuff]中为项写入来确保stuff是一个列表。”因为如果stuff已经是一个列表“
,那么它将生成一个嵌套列表,这正是当前的条件所做的。你是说<代码>如果不是实例(Studio,list)< /C>?为什么你考虑<代码>,如果不是IS实例(E,可迭代):< /代码>“复杂”还是“样板”?我看到的唯一警告是,您需要记住,str
也是Iterable
-尝试:
迭代并捕获错误(如果错误不Iterable)。通常不鼓励进行类型检查,但使用ensurelist
函数并不是真正的类型检查。相反,我建议您看看为什么会出现这种情况,以及是否有一种方法可以拥有更好的类型化API。例如,调用方负责提供正确类型的dispatch([stuff])
。(相当于,def dispatch(*stuff):
,将责任放在希望传递iterables的调用方身上。)@Ry-这只会将问题转移到调用代码上。如果stuff
已经是一个列表,则使用嵌套列表调用dispatch
def dispatch(stuff):
do_something_with(item)
def dispatch_all(stuff):
for item in stuff:
dispatch(item)