Как насчет этого:
def recursive(stop_type):
def _inner(func):
def _recursive(data, *args, **kw):
if not isinstance(data, stop_type):
return map(_recursive, data)
return func(data, *args, **kw)
return _recursive
return _inner
Объяснение того, как это работает, если используется как @recursive(MySingularType)
- рекурсив вызывается во время декорирования функции с аргументом stop_type, установленным в
MySingularType
- рекурсивное закрытие возвратов
_inner
_inner
немедленно вызывается с функцией декорирования, также во время компиляции
_inner
возвращает замыкание _recursive
, которое теперь является новой функцией, которая вызывается при вызове декорированной функции
Теперь, когда вы вызываете свою функцию: _recursive
вызывается. Если тип соответствует, вернуть результат функции. В противном случае, сопоставьте другой вызов _recursive, до бесконечности (ну, действительно, пока не будет stackoverflowium)
Примечание Вы можете опустить *args
и **kwargs
, если декорированная функция всегда всегда будет принимать только одно значение