Python 2中的abc.Sequence的等效项

时间:2018-07-03 09:38:03

标签: python python-3.x python-2.7 code-conversion

我需要将一些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 对我来说毫无意义。

1 个答案:

答案 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而不是Sequencestr((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

现在,对您的问题的真正答案可能有所不同:(“或多或少”)形式是“序列”的正式定义,并且在上下文中调用了您要移植的代码,而作者的意图。

作者可能已经假定他的函数只能通过列表,元组,字符串或字节传递,在这种情况下,测试意图的确是被误导了(我什至会说是破损的),并且没有证件地尝试检查字符串和个字节。

或者作者可能已经假设他的函数永远不会传递字符串或字节,但是我不明白为什么他会把列表和元组与其他序列区别对待。

长话短说:您将必须研究上下文,或者最终请作者澄清-当然,​​如果可能的话。