假设我有一些对象x可能是数据类型的单个实例(比方说float),或者它可能是一个float类型列表.
有没有什么我可以确保x包装为一个列表,如果有必要可能是一个单例列表,而不检查其类型或做这样的事情.
我想要list(x)总是工作的东西,无论x是单身还是单身,但这不起作用,因为单身不可迭代.
同时,我不想定义自己的函数来构造来自singeltons的列表,我也不想像这样内联任何内容:
from collections import Iterable
y = [x] if not isinstance(x, Iterable) else list(x)
Run Code Online (Sandbox Code Playgroud)
如果没有比这更简洁的话,那没关系.我正在寻找一些已经内置于语言中的干净方法.
我相信有些人可能认为这种isinstance方法很干净而且很好,但我特别想找到一些更简洁的东西,不要求我先写任何新内容.我在搜索文档页面时找不到任何内容,而且我不确定如何向搜索引擎提出这个问题.
这是你没有问过的问题的答案,但也许应该有.我只能猜测,因为你没有给出相关的背景.
我如何处理违反我的接口合同的传递给我的论点?
你不应该试着.如果我打电话给sum(2)我正确的
TypeError:'int'对象不可迭代
因为sum期待迭代,我没有给它一个.如果你担心有人会同时打电话
my_function(2.2)
my_function([2.2, 4.4])
Run Code Online (Sandbox Code Playgroud)
正确的反应是引发TypeError,而不是尝试为调用者修补问题,因为只要你修复第一个案例,就会有人调用
my_function([2.2, 'loretta'])
Run Code Online (Sandbox Code Playgroud)
你也覆盖那个案子吗?如果他们向您提供自我参考列表怎么办?如果你来自强类型的语言背景,那么滥用Python就会有很强的诱惑力,因此它就像Java一样.这只会产生糟糕的Python代码:你在缺陷之上堆积了一个黑客.
而且"类型安全"也有点像芥末,否则double sqrt(float)不会返回域错误,但确实如此.应该sqrt采取其论证的绝对值?呼叫签名中的掩码错误仅确保缺陷未被发现,然后在您获得无法预期的无效参数时稍后中断.
我不知道有什么内置的东西。您的解决方案对我来说看起来是最好的选择,尽管您可能想使用序列 ABC 而不是 Iterable。