作为回忆录机制的一部分,我有一个生成器,我tee它,我需要用isinstnace检查它的类型。
>>> gen = (i for i in range(5))
>>> one, two = itertools.tee(gen, 2)然后
>>> type(one), type(two)
(itertools.tee, itertools.tee)如所料,但是
>>> isinstance(one, itertools.tee)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types那么tee的实例是什么呢?
发布于 2016-03-09 01:25:31
假设我们定义了一个类MyClass
class MyClass(object):
pass然后,我们定义一个覆盖该类的函数:
def MyClass(x=MyClass):
return x()如果我们调用该函数,我们将得到原始MyClass的一个实例
>>> instance = MyClass()
>>> type(instance)
<class '__main__.MyClass'>它看起来像是一个类,因为它的返回值的类型具有相同的名称,但是请看一看:
>>> type(MyClass)
<type 'function'>MyClass是一个返回MyClass实例的函数,但它们是不同的。tee也是如此。tee是一个返回tee实例的函数。当您看到该实例是否为tee类型时,您实际上不是检查一个类或一个类型,而是检查一个函数。isinstance()不允许这样做,因此出现了错误。获取类的方法是创建一个实例:
>>> tee = type(itertools.tee(())[0])
>>> isinstance(one, tee)
True发布于 2016-03-09 01:20:40
itertools.tee是一个函数,而不是一个类(参见type(itertools.tee))。它返回的对象是(有些令人困惑的) tee类的实例,但该类在itertools命名空间中不可用。我只需要使用type()从实例中获取它。如果您没有现成的实例,请创建一个实例。这似乎是获得tee类型的最小数量的代码:
TeeType = type(itertools.tee(())[0])看起来,tee在每次调用中始终使用相同的类。
发布于 2016-03-09 01:20:57
tee是一个函数,它返回Python使用的内部实现类型。一般来说,它是tee或任何其他iterator/generator类型都不重要。
也就是说,如果您确实需要像这样键入测试,您可以这样做,您只需要通过使用tee派生出type实例的"true“类型,就像您已经使用type检查了该类型一样。例如,要将tee实例的类型存储在名为Tee的变量中,请执行以下操作:
Tee = type(itertools.tee(())[0])它调用tee获取实例,然后使用type获取它们的类。
这是记录的唯一可移植的方法;实际类型涉及(在内部实现)从一个版本更改到另一个版本;在Python3.5中,您可以以itertools._tee的形式访问原始类型,但是在您的版本中,它显然不是那样公开的。
https://stackoverflow.com/questions/35881054
复制相似问题