Unexpected PendingDeprecationWarning

Nathan Ernst nathan.ernst at gmail.com
Tue Nov 22 22:14:08 EST 2016


Thanks,

I was not aware of that PEP.

The logic in my function is exactly as desired, so to squelch the warning,
I merely wrapped the iteration in a try/except:

def adjacent_difference(seq, selector=identity):
  i = iter(seq)
  l = selector(next(i))
  try:
    while True:
      r = selector(next(i))
      yield r - l
      l = r
  except StopIteration:
    return


On Tue, Nov 22, 2016 at 9:02 PM, MRAB <python at mrabarnett.plus.com> wrote:

> On 2016-11-23 02:50, Nathan Ernst wrote:
>
>> I'm using Python 3.5.2, and the following code (when invoked) causes a
>> PendingDeprecationWarning when used in a unit test:
>>
>> def identity(x):
>>   return x
>>
>> def adjacent_difference(seq, selector=identity):
>>   i = iter(seq)
>>   l = selector(next(i))
>>   while True:
>>     r = selector(next(i))
>>     yield r - l
>>     l = r
>>
>> I wrote this to mimic the C++ std algorithm (defined here:
>> http://en.cppreference.com/w/cpp/algorithm/adjacent_difference).
>>
>> What I don't understand is why I get this warning.
>>
>> The exact error message I get from unittest is:
>> PendingDeprecationWarning: generator 'adjacent_difference' raised
>> StopIteration
>>
>> I'd appreciate any insight into what is causing this deprecation warning,
>> as I am stumped.
>>
>> The 'while' loop keeps calling next(i) until it raises StopIteration, and
> that kind of behaviour can hide obscure bugs.
>
> If you want to know the details, you can read the rationale behind the
> change in the relevant PEP:
>
> PEP 479 -- Change StopIteration handling inside generators
> https://www.python.org/dev/peps/pep-0479/
>
> --
> https://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list