我有一个函数,当它被调用时,我想知道该返回值将被赋值给它-特别是当它作为一个元组被解压缩时。所以:

a = func()         # n = 1


a, b, c = func()   # n = 3

我想在n中使用func的值。必须使用inspect_getframe进行一些魔术操作,以使我能够执行此操作。有任何想法吗?

免责声明(因为如今这似乎是必需的):我知道这很时髦,是一种不好的做法,不应在生产代码中使用。实际上看起来就像我在Perl中期望的一样。我不是在寻找解决我所谓的“实际”问题的其他方法,但是我很好奇如何实现我上面的要求。这个技巧的一个很酷的用法是:
ONE, TWO, THREE = count()
ONE, TWO, THREE, FOUR = count()


def count():
    n = get_return_count()
    if not n:
        return
    return range(n)

最佳答案

改编自http://code.activestate.com/recipes/284742-finding-out-the-number-of-values-the-caller-is-exp/:

import inspect
import dis

def expecting(offset=0):
    """Return how many values the caller is expecting"""
    f = inspect.currentframe().f_back.f_back
    i = f.f_lasti + offset
    bytecode = f.f_code.co_code
    instruction = ord(bytecode[i])
    if instruction == dis.opmap['UNPACK_SEQUENCE']:
        return ord(bytecode[i + 1])
    elif instruction == dis.opmap['POP_TOP']:
        return 0
    else:
        return 1

def count():
    # offset = 3 bytecodes from the call op to the unpack op
    return range(expecting(offset=3))

或作为可以检测何时打开包装的对象:
class count(object):
    def __iter__(self):
        # offset = 0 because we are at the unpack op
        return iter(range(expecting(offset=0)))

关于python - 找出多少个返回值将被拆包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16481156/

10-09 19:15