In python is there a way to check if a function is a “generator function” before calling it?

后端 未结 3 1229
日久生厌
日久生厌 2020-12-13 03:44

Lets say I have two functions:

def foo():
  return \'foo\'

def bar():
  yield \'bar\'

The first one is a normal function, and the second i

3条回答
  •  旧巷少年郎
    2020-12-13 04:06

    I've implemented a decorator that hooks on the decorated function returned/yielded value. Its basic goes:

    import types
    def output(notifier):
        def decorator(f):
            def wrapped(*args, **kwargs):
                r = f(*args, **kwargs)
                if type(r) is types.GeneratorType:
                    for item in r:
                        # do something
                        yield item
                else:
                    # do something
                    return r
        return decorator
    

    It works because the decorator function is unconditionnaly called: it is the return value that is tested.


    EDIT: Following the comment by Robert Lujo, I ended up with something like:

    def middleman(f):
        def return_result(r):
            return r
        def yield_result(r):
            for i in r:
                yield i
        def decorator(*a, **kwa):
            if inspect.isgeneratorfunction(f):
                return yield_result(f(*a, **kwa))
            else:
                return return_result(f(*a, **kwa))
        return decorator
    

提交回复
热议问题