我需要将一些Python 3代码转换为Python 2代码
from collections.abc import Sequence
def to_tensor(X, device):
.....
if isinstance(X, (list, tuple)):
return [to_tensor_(x) for x in X]
if isinstance(X,Sequence):<-------equals to if isinstance(X,(str,bytes))?
X = torch.tensor(np.array(X))
return X.to(device)
如您在上面看到的,我想知道是否:
isinstance(X,Sequence)
等于
isinstance(X,(str,bytes))
和the documentation 对我来说毫无意义。
答案 0 :(得分:1)
简短的回答:不,这不是等效的。
最长的答案:
首先,Python2没有“字节”类型-Python3 bytes
是Python2 str
,而Python3 str
是Python2 unicode
,所以正确的问题是:{ {1}}等同于isinstance(X,Sequence)
。
然后,答案是 still 不。 Py3 isinstance(X, (unicode, str))
和str
确实是bytes
的实例,但是但是实现abc.Sequence
的类的任何实例也是如此,因此您可以拥有是abc.Sequence
而不是Sequence
或str
((Django orm的bytes
类将是理想的候选人)。
和这个文档:https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence对我来说不是没有道理
如果您点击此文档中的链接,you get a verbal definition的“顺序”是:
一个支持使用整数的有效元素访问的迭代器 通过 getitem ()特殊方法建立索引,并定义 len () 返回序列长度的方法 (..) 请注意,dict也支持 getitem ()和 len (),但被认为是映射而不是序列
根据此定义,要测试对象是否为序列,必须测试它是否可迭代,并具有Queryset
和__getitem__
方法,而不是__len_
。这不会是py3代码的 exact 等效项,但是它可以使您获得的距离更近(至少在没有更多上下文的情况下,请参见下文):
dict
现在,对您的问题的真正答案可能有所不同:(“或多或少”)形式是“序列”的正式定义,并且在上下文中调用了您要移植的代码,而作者的意图。
作者可能已经假定他的函数只能通过列表,元组,字符串或字节传递,在这种情况下,测试意图的确是被误导了(我什至会说是破损的),并且没有证件地尝试检查字符串和个字节。
或者作者可能已经假设他的函数永远不会传递字符串或字节,但是我不明白为什么他会把列表和元组与其他序列区别对待。
长话短说:您将必须研究上下文,或者最终请作者澄清-当然,如果可能的话。