我需要把一些python3代码转换成python2代码
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 对我来说毫无意义。你知道吗
简言之:不,它不是等价的。你知道吗
最长答案:
首先,Python2没有“bytes”类型-Python3
bytes
是Python2str
,Python3str
是Python2unicode
,所以正确的问题是:isinstance(X,Sequence)
是否等价于isinstance(X, (unicode, str))
。你知道吗那么,答案仍然是否定的。Py3
str
和bytes
确实是abc.Sequence
的实例,但是实现abc.Sequence
的类的任何实例也是Sequence
的对象,而不是str
或bytes
(Django orm的Queryset
类将是一个完美的候选者)。你知道吗如果您遵循本文档中的链接,you get a verbal definition了解什么是“序列”:
根据这个定义,要测试一个对象是否是序列,您必须测试它是否是iterable,是否有
__getitem__
和__len_
方法,并且不是dict
。这与py3代码不同,但您可以更接近它(至少在没有更多上下文的情况下,参见下文):现在,您的问题的真正答案可能有点不同:有“序列”的正式定义(更多或更少),还有调用您移植的代码的上下文和作者的意图。你知道吗
作者可能假设他的函数只会被传递列表、元组、字符串或字节,在这种情况下,测试意图确实是一种错误的(我甚至可以说是中断的)和没有文档记录的尝试来检查字符串和字节。你知道吗
或者作者可能假设他的函数永远不会被传递一个字符串或字节,但是我不明白为什么他会把列表和元组与其他序列区别对待。你知道吗
长话短说:你必须研究上下文,或者最终要求作者澄清——当然,如果可能的话。你知道吗
相关问题 更多 >
编程相关推荐