프로그래밍/Python

[python] itertools.pairwise() 함수 사용법

채윤아빠 2023. 11. 21. 08:39
728x90
반응형

GStreamer로 작업을 하다보면, 파이프라인 구축을 위하여 생성된 항목들을 연결 (link)해주어야 합니다.

C에서는 gst_bin_add_many() 함수가 있어서 간단하게 구현이 가능한데, 파이썬에서는 해당 함수 대신 Element.link_many() 함수를 이용해야 합니다. 그래서 link_many() 함수가 어떻게 구현이 되어 있는지 궁금하여 찾아 보니, 다음과 같이 구현되어 있었습니다.

from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, none)
    return zip(a, b)

Gst.Element에 다음과 같이 link_many() 함수가 구현되어 있습니다.

class Element(Gst.Element):
    @staticmethod
    def link_many(*args):
        '''
        @raises: Gst.LinkError
        '''
        for pair in pairwise(args):
            if not pair[0].link(pair[1]):
                raise LinkError(
                    'Failed to link {} and {}'.format(pair[0], pair[1]))

다음과 같이 예제를 보면, 동작 이해가 더욱 쉬우실 겁니다.

from itertools import pairwise

class Element:
    @staticmethod
    def link_many(*args):
        '''
        @raises: Gst.LinkError
        '''
        for pair in pairwise(args):
            print(f'pairwise to link {pair[0]} and {pair[1]}')

Element.link_many(1, 2, 3, 4, 5)

위 예제를 실행한 결과는 다음과 같습니다.

pairwise to link 1 and 2
pairwise to link 2 and 3
pairwise to link 3 and 4
pairwise to link 4 and 5

GStreamer에서 생성된 각 요소 (Element)를 서로 연결하여 파이프라인을 만들 때와 같이 앞 항목과 뒤 항목을 가지고 반복작업을 수행할 때 아주 유용한 pairwise() 함수였습니다.

"itertools" 패키지에 pairwise() 함수 말고도 생각보다 유용한 함수들이 꾀 있었습니다. 관심있으신 분은 아래의 참고자료를 확인해 보시면 도움이 되실 겁니다.


참고자료