Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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创建单成员列表的简明方法?_Python_List - Fatal编程技术网

用Python创建单成员列表的简明方法?

用Python创建单成员列表的简明方法?,python,list,Python,List,假设我有一个对象x,它可能是一个数据类型的单个实例(比如float),也可能是一个float类型列表 有什么我可以确保x被包装成一个列表,如果需要的话,可能是一个单例列表,而不检查它的类型或做类似的事情 我希望像list(x)这样的东西总是有效的,不管x是否是单例,但这不起作用,因为单例是不可移植的 编辑:有关详细信息,请参见 同时,我不想定义自己的函数来从Singelton构造列表,也不想做任何类似这样的内联操作: from collections import Iterable y = [x

假设我有一个对象
x
,它可能是一个数据类型的单个实例(比如
float
),也可能是一个
float
类型列表

有什么我可以确保
x
被包装成一个列表,如果需要的话,可能是一个单例列表,而不检查它的类型或做类似的事情

我希望像
list(x)
这样的东西总是有效的,不管
x
是否是单例,但这不起作用,因为单例是不可移植的

编辑:有关详细信息,请参见

同时,我不想定义自己的函数来从Singelton构造列表,也不想做任何类似这样的内联操作:

from collections import Iterable
y = [x] if not isinstance(x, Iterable) else list(x)
如果没有比这更简洁的东西存在,那没关系。我正在寻找一些干净的方法来实现这一点,这种方法已经内置到语言中


我相信有些人可能会认为
isinstance
方法是干净和好的,但我特别想找一种更简洁的方法,不需要我写任何新的东西。我只是在搜索文档页面时找不到任何东西,我不知道如何向搜索引擎询问这个问题。

我不知道内置了这样的东西。对我来说,您的解决方案似乎是最好的选择,不过您可能希望使用序列ABC而不是Iterable。

以下是您没有问过的问题的答案,但可能应该有。我只能猜测,因为你没有给出相关的上下文

如何处理传递给我的违反接口约定的参数?

你不应该这样做。如果我调用sum(2)

TypeError:“int”对象不可编辑

因为
sum
期望一个iterable,而我没有给它一个。如果你担心有人会同时打电话给他们

my_function(2.2)
my_function([2.2, 4.4])
正确的反应是提出一个TypeError,而不是试图为调用者修补问题,因为一旦你解决了第一个问题,就会有人打电话来

my_function([2.2, 'loretta'])
你也负责那个案子吗?如果他们给你一份自我参照清单呢?如果您来自强类型语言背景,那么很容易滥用Python,使其行为类似于Java。这只会产生糟糕的Python代码:您在缺陷之上堆积了一个黑客


“类型安全性”也有点像谣言,否则
double-sqrt(float)
不必返回域错误,但它确实返回了域错误。
sqrt
应该取其参数的绝对值吗?在调用签名中屏蔽错误只会确保缺陷不会被发现,然后当您得到一个您没有预料到的无效参数时,缺陷会被破坏。

在对Python有了更多的经验之后,在重新讨论这个问题时,我想到了一个解决方案,但它违反了我当时所要求的不定义函数的属性

def make_list_containing(*args):
    return list(args)
然后
make_list_containing(3)
make_list_containing('foo')
按照人们的预期行事(与
list
构造函数相反,你必须改变你的直觉来学习如何预期它的行为)

我仍然感到惊讶的是,
list
作为构造函数与“convert to
list
type”同义,而不是“place to a
list
object instance”

我可以看出构造函数的多态性行为在单例中是如何不明确的,而单例也是可重用的,比如字符串。但是,为什么不支持非iterable单例的“放入列表”行为呢

另一件事是,至少对我来说,我所描述的方法似乎更为一致,也更符合最起码的惊讶

使用
make\u list\u containing
您知道您总是会得到一个列表,它将包含传入的元素。只要你用你想要的格式传递它们,那么你就可以得到它。考虑:

In [34]: make_list_containing(*'foo')
Out[34]: ['f', 'o', 'o']

In [35]: make_list_containing('foo')
Out[35]: ['foo']

[40]中的
:生成包含(*枚举(范围(3))的列表)
Out[40]:[(0,0)、(1,1)、(2,2)]
在[41]中:使列表包含(枚举(范围(3)))
Out[41]:[]
现在我觉得这更直观了。预结束
*
正是我应该如何“反迭代”某些内容中的项作为参数。如果我没有特意选择它,那么我必须将
'foo'
视为一个单体,并计划在函数调用内部处理它的元素或可移植性

在这段对话中令人沮丧的一件事是,仅仅因为Python的这种惯例是过时的,所以老年人似乎将其与含义混为一谈,这并不奇怪。但这只是对惊奇的狭义定义。是的,当我启动解释器时,当
list('foo')
给我
['f','o','o']
时,我不再感到“惊讶”。但我仍然感到惊讶的是,对于与
list
一样重要的构造函数来说,这是语言的接口选择。这让我感到惊讶,因为它似乎有更多的设计弱点而不是优势,而且最初用来证明它的合理性的是一些语法的流畅性,而不是思想的清晰性


在这一点上,它偏离了观点区太远了,我显然同意这样一个事实,即由于压倒性的历史势头,Python不会改变这一点。但我的问题的精神仍然是关于这一非常合理的观点。这不是大多数评论所希望的“懒惰”或“只需编写一个包装函数并继续”的问题。

在我看来,
Iterable
正是检查的正确概念。问题是我想要其他已经进行检查的东西,比如
列表
构造函数。我很惊讶让程序员来做这个检查。我知道程序员应该知道他们什么时候在做一些关于单例的事情,但似乎只是在默认情况下制作一个单例列表要比抛出一个T要好得多
In [40]: make_list_containing(*enumerate(range(3)))
Out[40]: [(0, 0), (1, 1), (2, 2)]

In [41]: make_list_containing(enumerate(range(3)))
Out[41]: [<enumerate at 0x7f61a7f0fd70>]