[Maya-Python] StopIteration, where art thou?

131 views
Skip to first unread message

Marcus Ottosson

unread,
Oct 9, 2017, 9:03:12 AM10/9/17
to python_in...@googlegroups.com

I remember having this a while back, but this time it really flabbergasted me.

def iterator():
    yield

it = iterator()
next(it)
next(it)

Or take this one.

next(i for i in range(0))

What should happen is this.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

But instead, nothing. It’s problem when this happens somewhere in your code.

def create_transform():
  transform = cmds.createNode("transform", name="MyTransform")
  next(i for i in range(0))
  return transform

transform = create_transform()
print(transform)
# Error: name 'transform' is not defined
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# NameError: name 'transform' is not defined #

It’s not defined, because that line never runs. An exception is thrown, silently, stopping the script.

Other exceptions run fine.

1/0
# Error: integer division or modulo by zero
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# ZeroDivisionError: integer division or modulo by zero #

Normally, you can instantiate an exception yourself, like this.

ZeroDivisionError
# Result: <type 'exceptions.ZeroDivisionError'> #

But guess what happens for StopIteration?

StopIteration
# Error: name 'StopIterationError' is not defined
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# NameError: name 'StopIterationError' is not defined #

This is in Maya 2015 and 2018, and I bet it happens in other versions too. A native exception is undefined. What gives?

Michael Boon

unread,
Oct 10, 2017, 2:22:42 AM10/10/17
to Python Programming for Autodesk Maya
Wow! Happens in 2016 too.
However, StopIteration is defined, and I can catch it.

This:
a = iter([1,2])
for i in range(4):
   
print i, next(a)
gives
0 1
1 2
2

While this:
a = iter([1,2])
for i in range(4):
   
try:
       
print i, next(a)
   
except StopIteration:
       
print 'StopIteration'
gives
0 1
1 2
2 StopIteration
3 StopIteration

Marcus Ottosson

unread,
Oct 10, 2017, 2:40:37 AM10/10/17
to python_in...@googlegroups.com
Can confirm that it is defined in 2018 as well. The above was in 2015. How peculiar.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsub...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/e9c86276-76f3-48d3-bae9-db935b7cca60%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Justin Israel

unread,
Oct 11, 2017, 4:23:57 PM10/11/17
to python_in...@googlegroups.com
Is this only in Windows? I just tested 2016, 2017, and 2018. They all have StopIteration available.

To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/CAFRtmOC6mFDTZgewPjbNNofn-8J1w55Fk7B2w5PYa4M18i9s4g%40mail.gmail.com.

Robert White

unread,
Oct 11, 2017, 5:09:43 PM10/11/17
to Python Programming for Autodesk Maya
I can see StopIteration just fine in 2018 on windows.

It should live in both __builtins__ and the exceptions module. 
Maybe some other script is messing those up?
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsub...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsub...@googlegroups.com.

Michael Boon

unread,
Oct 11, 2017, 11:30:35 PM10/11/17
to Python Programming for Autodesk Maya
I'm on Windows. To clarify though, it's not about StopIteration being available (except in 2015, apparently). It's about StopIteration being silently caught. This appears to only happen in the Listener. In 2018, at least, if I try it in an imported Python module, it works as expected. I don't know what would happen in external editors.

To add to the confusion, if you catch and raise the exception, it works.
This
i = iter([0,1])
for n in range(3):
   
print n, next(i)
fails silently:
0 0
1 1
2

While this
i = iter([0,1])
for n in range(3):
   
try:
       
print n, next(i)
   
except Exception as e:
       
raise
shows the unhandled exception:
0 0
1 1
2# Error:
# Traceback (most recent call last):
#   File "<maya console>", line 4, in <module>
# StopIteration #

Robert White

unread,
Oct 12, 2017, 1:50:16 AM10/12/17
to Python Programming for Autodesk Maya
Huh, that is super weird.

I'm getting the same behavior. It probably has something to do with how maya is exec-ing the listener. Clearly it is throwing the exception, it just getting swallowed somewhere along the way. Maybe the for loop is grabbing it? execution does stop though.

Really weird.

Marcus Ottosson

unread,
Oct 12, 2017, 5:06:47 AM10/12/17
to python_in...@googlegroups.com

This appears to only happen in the Listener. In 2018, at least, if I try it in an imported Python module, it works as expected

Not for me, this is what initially bummed me out. My script got imported right, but one of the functions silently threw this exception and refused to continue. This was in 2018 on Windows.


To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages