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