복붙노트

[PYTHON] 반환 값을 몇 개의 값으로 압축 해제할지 알아보십시오.

PYTHON

반환 값을 몇 개의 값으로 압축 해제할지 알아보십시오.

나는 함수를 가지고 있는데, 호출 될 때 반환 값이 할당 될 것임을 알고 싶다. 특히 튜플로 언 패킹 된 경우에 그렇다. 그래서:

a = func()         # n = 1

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

func에서 n 값을 사용하고 싶습니다. 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)

해결법

  1. ==============================

    1.http://code.activestate.com/recipes/284742-finding-out-the-number-of-values-the-caller-is-exp/에서 변경됨 :

    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)))
    
  2. ==============================

    2.파이썬이 어떻게하는지에 대해서는 거의 마법이 없습니다.

    파이썬이 어떻게하는지에 대해서는 거의 마법이 없습니다.

    간단히 말해서, 왼편에 하나 이상의 목표 이름을 사용한다면, 오른쪽 표현식은 일치하는 길이의 시퀀스를 반환해야합니다.

    둘 이상의 값을 반환하는 함수는 실제로 하나의 튜플을 반환합니다. 표준 Python 구조입니다. 특정 길이의 시퀀스입니다. 길이를 측정 할 수 있습니다.

    retval = func()
    
    print len(retval)
    

    할당 언 패킹은 컴파일 타임에 결정되며 호출하는 함수에 맞게 왼쪽에 더 많은 인수를 동적으로 추가 할 수 없습니다.

    Python 3에서는 풀린 할당의 나머지를 캡쳐하기 위해 와일드 카드 인 스 플랫 (splat) 구문을 사용할 수 있습니다.

    a, b, *c = func()
    

    c는 이제 첫 번째 2를 벗어나는 나머지 값이있는 목록이됩니다.

    >>> def func(*a): return a
    ... 
    >>> a, b, *c = func(1, 2)
    >>> a, b, c
    (1, 2, [])
    >>> a, b, *c = func(1, 2, 3)
    >>> a, b, c
    (1, 2, [3])
    >>> a, b, *c = func(1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: need more than 1 value to unpack
    
  3. from https://stackoverflow.com/questions/16481156/find-out-into-how-many-values-a-return-value-will-be-unpacked by cc-by-sa and MIT license