Python 2中abc.Sequence的等价物

Python 2中abc.Sequence的等价物,python,python-3.x,python-2.7,code-conversion,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,(

我需要将一些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,(str,bytes))

对我来说没有任何意义。

简短的回答:不,它不是等价物

最长答案:

首先,Python2没有“字节”类型——Python3
bytes
是Python2
str
而Python3
str
是Python2
unicode
,所以正确的问题是:
isinstance(X,Sequence)
等同于
isinstance(X,(unicode,str))

然后,答案仍然是否定的。Py3
str
bytes
确实是
abc.Sequence
的实例,但是实现
abc.Sequence
的类的任何实例也是
Sequence
的实例,因此您可以拥有
Sequence
的对象,而不是
str
bytes
((Django orm的
Queryset
类将是一个完美的候选者)

医生:对我来说没有意义

如果您遵循本文档中的链接,那么“序列”是什么:

支持使用整数进行有效元素访问的iterable 通过getitem()特殊方法进行索引,并定义len() 方法返回序列的长度 (..) 注意,dict还支持getitem()和len(),但被认为是映射而不是序列

根据这个定义,要测试一个对象是否是一个序列,你必须测试它是否是可写的,有一个
\uuuu getitem\uuuuuuuuuuuu
和一个
\uuuuuu len\uuuuuuuuu
方法,而不是一个
dict
。这并不是py3代码的精确等价物,但它是你能得到的最接近的方法(至少没有更多的上下文,参见下文):

现在,您的问题的真正答案可能有点不同:有“序列”的正式定义(更多或更多),还有调用您移植的代码的上下文和作者的意图

作者可能假设他的函数只传递列表、元组、字符串或字节,在这种情况下,测试意图确实是错误的(我甚至会说是错误的)和未记录的尝试来检查字符串和字节

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

长话短说:你必须研究上下文,或者最终要求作者澄清——当然,如果可能的话

isinstance(X,(str,bytes))
def is_sequence(obj):
    if isinstance(obj, dict):
        return False

    if not (
        hasattr(obj, "__getitem__") 
        and hasattr(obj, "__len__")
        ): 
        return False

    # we might have false postive here
    # with dict-likes not inheriting from
    # `dict`, so we also weed out objects 
    # having a `keys()` methods which
    # are most likely dict-likes
    if hasattr(obj, "keys"):
        return False
    return True