首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有tee对象的isinstance

具有tee对象的isinstance
EN

Stack Overflow用户
提问于 2016-03-09 01:01:04
回答 5查看 234关注 0票数 0

作为回忆录机制的一部分,我有一个生成器,我tee它,我需要用isinstnace检查它的类型。

代码语言:javascript
复制
>>> gen = (i for i in range(5))
>>> one, two = itertools.tee(gen, 2)

然后

代码语言:javascript
复制
>>> type(one), type(two)
(itertools.tee, itertools.tee)

如所料,但是

代码语言:javascript
复制
>>> isinstance(one, itertools.tee)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

那么tee的实例是什么呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-09 01:25:31

假设我们定义了一个类MyClass

代码语言:javascript
复制
class MyClass(object):
    pass

然后,我们定义一个覆盖该类的函数:

代码语言:javascript
复制
def MyClass(x=MyClass):
    return x()

如果我们调用该函数,我们将得到原始MyClass的一个实例

代码语言:javascript
复制
>>> instance = MyClass()
>>> type(instance)
<class '__main__.MyClass'>

它看起来像是一个类,因为它的返回值的类型具有相同的名称,但是请看一看:

代码语言:javascript
复制
>>> type(MyClass)
<type 'function'>

MyClass是一个返回MyClass实例的函数,但它们是不同的。tee也是如此。tee是一个返回tee实例的函数。当您看到该实例是否为tee类型时,您实际上不是检查一个类或一个类型,而是检查一个函数。isinstance()不允许这样做,因此出现了错误。获取类的方法是创建一个实例:

代码语言:javascript
复制
>>> tee = type(itertools.tee(())[0])
>>> isinstance(one, tee)
True
票数 2
EN

Stack Overflow用户

发布于 2016-03-09 01:20:40

itertools.tee是一个函数,而不是一个类(参见type(itertools.tee))。它返回的对象是(有些令人困惑的) tee类的实例,但该类在itertools命名空间中不可用。我只需要使用type()从实例中获取它。如果您没有现成的实例,请创建一个实例。这似乎是获得tee类型的最小数量的代码:

代码语言:javascript
复制
TeeType = type(itertools.tee(())[0])

看起来,tee在每次调用中始终使用相同的类。

票数 4
EN

Stack Overflow用户

发布于 2016-03-09 01:20:57

tee是一个函数,它返回Python使用的内部实现类型。一般来说,它是tee或任何其他iterator/generator类型都不重要。

也就是说,如果您确实需要像这样键入测试,您可以这样做,您只需要通过使用tee派生出type实例的"true“类型,就像您已经使用type检查了该类型一样。例如,要将tee实例的类型存储在名为Tee的变量中,请执行以下操作:

代码语言:javascript
复制
Tee = type(itertools.tee(())[0])

它调用tee获取实例,然后使用type获取它们的类。

这是记录的唯一可移植的方法;实际类型涉及(在内部实现)从一个版本更改到另一个版本;在Python3.5中,您可以以itertools._tee的形式访问原始类型,但是在您的版本中,它显然不是那样公开的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35881054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档