Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 确保变量是一个列表_Python 3.x_List - Fatal编程技术网

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)