你如何使用没有 __iter__ 方法的迭代器?

问题描述

在 Maya 中尝试一些基本编程时,我遇到了“MitMeshpolygon”方法。被描述为: “这个类是多边形表面(网格)的迭代器。”

(https://help.autodesk.com/view/MAYAUL/2016/ENU/?guid=__py_ref_class_open_maya_1_1_m_it_mesh_polygon_html)

这似乎是我所需要的,所以我更多地研究了迭代器,据我所知,迭代器本身应该是可迭代的,并且有一个 iter 方法。然而,当试图迭代它时,python 告诉我它不可迭代。

        iterable = OpenMaya.MItMeshpolygon(dagPaths[0])            
        while not iterable.isDone():
            print(iterable)
            print(dir(iterable))

>

['class','delattr','dict','dir','doc'、'eq'、'格式'、'ge'、'getattribute >','gt','hash','init','init_subclass','le'、'lt'、'模块'、'ne'、' ','next','reduce','reduce_ex','repr',' setattr'、'sizeof'、'str'、'subclasshook'、'swig_destroy','weakref','center','className','count','currentItem','geomChanged','getArea','getAxisAtUV','getColor','getColorIndex','getColorIndices ','getColors','getConnectedEdges','getConnectedFaces','getConnectedVertices','getEdges','getnormal','getnormals','g etPointAtUV'、'getPoints'、'getTriangle'、'getTriangles'、'getUV'、'getUVArea'、'getUVAtPoint'、'getUVIndex'、'getUVSetNames'、'getUVs'、'getVertices'、'hasColor'、'hasUVs','hasValidTriangulation','index','isConnectedToEdge','isConnectedToFace','isConnectedToVertex','isConvex','isDone','isHoled','isLamina','isPlanar','isstarlike','isUVRevers下一个','normalIndex','numColors','numConnectedEdges','numConnectedFaces','numTriangles','onBoundary','point','polygon','polygonVertexCount','reset','setIndex','setPoint','setPoints','setUV','setUVs','tangentIndex','this','thisown','updateSurface','vertexIndex','zeroArea','zeroUVArea']

我想遍历所有多边形和“getArea”,但现在我不知道该怎么做,我读到的所有内容都告诉我迭代器应该是可迭代的,但程序告诉我否则。我在这里不明白什么?如何使用这些方法获取有关 DagPath 指示的对象的特定信息?

解决方法

您的 iterable 有一个 __next__ 方法。您可以执行以下操作:

iterator = OpenMaya.MItMeshPolygon(dagPaths[0])            
try:
    while True:
        item = next(iterator)
        ...
except StopIteration:
    pass

请注意,我已将变量重命名为 iterator,因为这似乎是更正确的术语。一个可迭代对象确实应该有一个 __iter__ 方法,调用 iter(iterable) 会将它变成一个执行实际迭代的迭代器,并有一个 __next__ 方法。

事实上,iterator 实际上可能是一个生成器,在移动中产生值(使用 next()),并且您将无法访问随机定位的值(例如,使用索引),一个接一个。那么你只需要一个 __next()__ 方法。但没有看到 MitMeshPolygon 的实际代码,这是一种猜测。