[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.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.파이썬이 어떻게하는지에 대해서는 거의 마법이 없습니다.
파이썬이 어떻게하는지에 대해서는 거의 마법이 없습니다.
간단히 말해서, 왼편에 하나 이상의 목표 이름을 사용한다면, 오른쪽 표현식은 일치하는 길이의 시퀀스를 반환해야합니다.
둘 이상의 값을 반환하는 함수는 실제로 하나의 튜플을 반환합니다. 표준 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
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
'PYTHON' 카테고리의 다른 글
[PYTHON] 전체 문서를 메모리에로드하지 않고도 Excel 문서의 행 수를 얻을 수 있습니까? (0) | 2018.11.18 |
---|---|
[PYTHON] 장고 manytomany 신호? [복제] (0) | 2018.11.18 |
[PYTHON] 파이썬 :리스트의 가장 긴 공통 부분 시퀀스의 길이 (0) | 2018.11.18 |
[PYTHON] 이미지 크기 조정 웹 서비스 [닫힘] (0) | 2018.11.18 |
[PYTHON] 어떻게하면 파이썬을 사용하여 Windows에서 가까운 무선 LAN 네트워크의 신호 강도를 검색 할 수 있습니까? (0) | 2018.11.18 |