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

后端 未结 3 1236
日久生厌
日久生厌 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:09

    >>> def foo():
    ...   return 'foo'
    ... 
    >>> def bar():
    ...   yield 'bar'
    ... 
    >>> import dis
    >>> dis.dis(foo)
      2           0 LOAD_CONST               1 ('foo')
                  3 RETURN_VALUE        
    >>> dis.dis(bar)
      2           0 LOAD_CONST               1 ('bar')
                  3 YIELD_VALUE         
                  4 POP_TOP             
                  5 LOAD_CONST               0 (None)
                  8 RETURN_VALUE        
    >>> 
    

    As you see, the key difference is that the bytecode for bar will contain at least one YIELD_VALUE opcode. I recommend using the dis module (redirecting its output to a StringIO instance and checking its getvalue, of course) because this provides you a measure of robustness over bytecode changes -- the exact numeric values of the opcodes will change, but the disassembled symbolic value will stay pretty stable;-).

提交回复
热议问题