И сотворил Гвидо строки по образу C, по образу массивов символов сотворил их. И увидел Гвидо, что это хорошо. Или нет?
Представьте, что вы пишете совершенно идиоматичный код по обходу неких данных с вложенностью. Beautiful is better than ugly, simple is better than complex, так что вы останавливаетесь на следующем варианте кода:
from collections.abc import Iterable
def traverse(list_or_value, callback):
if isinstance(list_or_value, Iterable):
for item in list_or_value:
traverse(item, callback)
else:
callback(list_or_value)
Вы пишите юнит-тест, и что бы вы думали? Он не работает, причём не просто не работает, а
>>> traverse({"status": "ok"}, print)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in traverse
File "<stdin>", line 4, in traverse
File "<stdin>", line 4, in traverse
[Previous line repeated 989 more times]
File "<stdin>", line 2, in traverse
File "/usr/local/opt/python/libexec/bin/../../Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py", line 139, in __instancecheck__
return _abc_instancecheck(cls, instance)
RecursionError: maximum recursion depth exceeded in comparison
Как? Почему? В поисках ответа вы погрузитесь в удивительный мир коллекций бесконечной глубины.
Читать полностью »