【发布时间】:2020-04-29 16:46:44
【问题描述】:
some_obj = "scalar"
list_like = "__iter__" in dir(some_obj) # Py2: False; Py3: True
我在 python 2 中使用它来区分“不可迭代”(str、int、bool、None)和可迭代(list、dict、tuples)。
这不再适用于 python3,因为 str 现在具有 __iter__ 属性 (Why do strings in python 2.7 not have the "__iter__" attribute, but strings in python 3.7 have the "__iter__" attribute)。
嗯,通常希望将str 视为不像列表。那么有没有比"__iter__" in dir(some_obj) and not type(some_obj)==str 或this question 中的所有案例检查更好的py2+py3 方式?
我会错过像str 这样有争议的其他对象吗?
【问题讨论】:
-
任何实现
__iter__的对象都通过了您的检查。你想用这个来完成什么?乍一看,这似乎不是一个好的做法,并且不清楚您将在哪里放置“可迭代”或“不可迭代”对象之间的边界。如果没有额外的背景,这个问题没有多大意义,它是基于意见/充其量是过于宽泛。 -
由单个字符组成的列表和字符串有什么区别?在迭代方面什么都没有。 “内存中的紧凑对象”是一个相当空洞的标准。
-
@Friedrich 这正是我说这充其量是基于意见的原因。如果您想将“可迭代”定义为与语言定义不同的东西,那么请继续,但这实际上只是一种意见。
-
嗯,一切都是比特的集合,最终在堆栈的某个地方。真正的问题是你想用它做什么,这可能会让我们更接近解决方案。在什么情况下你需要区分集合对象(我猜这就是你要问的?)和其他语言可能称之为“原始”的东西?
-
“通常希望将
str视为不像列表”。比如……什么时候? (不,我不把“我想用我的函数来区分容器和非容器”作为例子。这样的函数几乎总是写成容器更好,调用者可以写foo([x]),如果只有要传递的单个值。)
标签: python python-3.x python-2.7