우아한 함수

  • argparse 라이브러리
  • 요약
  • 시작하기
  • 우아한 함수
  • 전체 예
  • 용도
  • 플러그인 프로그래밍 시 활용
  • 요약

  • 최근에 소스 스크립트를 살펴보았을 때 명령행 실행 스크립트에 대한 신기한 기교를 발견하고 기록을 하였다.

    argparse 라이브러리


    얼마 전에 ARgparse에 대해 맛만 보고 그만두었다. 잠자리가 물을 끄는 식으로 공부를 해서 자신이 쓸 수 있을 것 같아서 더 깊이 있게 공부하지 않았다. 그리고 다른 사람의 코드를 읽으면서 자신이 이 물건에 대해 진정으로 깨닫지 못했다는 것을 발견했다.
    GitHub에서 관련 스크립트의 코드를 읽을 때 이런 효과가 종종 나타난다.항상 그렇게 많은 각본이 당신의 눈앞을 환하게 할 것이다.그리고 자신도 모르게 자신의 부족한 점을 반성했다.
    나는 이것이 또 언제 누락된 것을 조사하고 보완하는 학습 방식이 아니라고 생각한다.하, 좀 빗나갔어.다음은 본론으로 들어가겠습니다.

    요약


    틀림없이 프로그래머로서, 많든 적든 명령줄에 사용될 것이다.Windows 운영 체제를 사용하는 사람도 일부 명령줄에 접근할 가능성이 높다.예를 들어 자신의 노트북이 현재 랜 안에 있는 IP 주소를 확인해 보세요.
    그림에서도 명령 뒤에 매개 변수를 따라다니고 조합(파이프 명령의 사용)도 했다. 리눅스 명령행의 예술은 더욱 신기하지만 토론 범위에 있지 않다. 여기는 여러 가지 서술에 불과하다.
    이렇게 자신의 프로그램에도 이런 신기한 표현을 하고 싶다면 파라미터를 추가하는 것이 좋은 선택이다.다행히도 파이톤은 마법의 실현을 더욱 쉽게 만들었다.정답 중 하나가 바로 아그파세입니다.

    입문


    argparse에 대해서도 너무 깊이 생각하지 마세요.그 기능은 우리가 입력한 명령을 해석하고 관련 매개 변수에 일치하는 값을 정확하게 부여하는 것이다.그뿐이야.다음은 간단한 예를 보고 입문한다.
    import argparse
    parser = argparse.ArgumentParser(description='You can use -h option to see the details of this application')
    
    args = parser.parse_args()
    print args

    코드와 운행 결과를 관찰하면 발견하기 어렵지 않다.argparse는 클래스 대상인 Namespace에 매개 변수를 정확하게 부여하는 데 도움을 줍니다.그리고 그 속성에 값을 부여하는 작업을 진행했다.그런 다음 스크립트에서 이러한 속성을 코드 실행에 필요한 매개 변수의 실제 참조값으로 사용할 수 있습니다.
    argparse에 대한 더 자세한 사용은 블로거 아래의 이 글을 참조할 수 있습니다.argparse 사용 설명

    우아한 함수


    Python에서는 모든 것이 대상입니다.즉, 클래스든 문자열이든 모두 대상이다.사실 함수도 하나의 대상이고 심지어 클래스의 유형을 나타내는 이 유형도 하나의 대상이다. 이 점은 파이톤 원본에서 상세하게 볼 수 있다.
    우아하다는 특성에 대해 먼저 작은 테스트를 보겠습니다.
    함수function은 사전의 어떤 키의 값으로 사용할 수 있다는 것을 발견하기 어렵지 않다.그리고 str_function는function의 별명에 해당하여function 함수를 복제한 다음에 우리는 function 함수를 호출하는 것처럼 마음대로 str_function 함수를 호출할 수 있다.
    그러면 다음에 작은 예를 하나 더 보겠습니다. 문자열을 사용하면 어떻게 될까요?
    잘못 보고하다.그렇다면 왜 이런 문제가 생겼는지 곰곰이 생각해 보자.
    회귀 코드에서 function 자체는 하나의 함수로 파이톤 해석기에 의해 사전에 얻어졌다.그리고 사전의 대상에 대해 키 값 쌍의 값은 모든 값이 될 수 있기 때문에function을 값으로 전달할 수 있습니다.그리고 그것은 여전히 함수일 것이다.
    반대로 문자열을 사용하면string이 인용하는 것은 하나의 문자열일 뿐입니다.그래서 하나의 함수로 해석될 수 없고 원래의 특성이 이 결과를 결정한다.
    이런 문제나 코드가 지혜롭지 못하다고 생각할 수도 있지만, 기초가 명확하지 않으면 이런 오류를 범할 수 있는 경우가 많다.특히 스크립트 언어에 대한 컴파일 차원의 검사가 없으면 문제가 더욱 빈번해질 수 있다.

    완전한 작은 예


    다음은 완전한 작은 예를 사용하여 총결산한다.코드 운행 결과의 원리를 곰곰이 생각해 볼 수 있다.그리고 우아한 함수의 우아한 특성은 도대체 어디에 나타나는지
    # coding:utf-8
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    # __author__ = '   '
    # __date__ = '2016/11/26'
    # __Desc__ =      
    import argparse
    
    def func1(param):
        print "Func1 is assembled Successfully and the parameter can be setted as {param}".format(param=param)
    
    def func2(param):
        print "Func2 is assembled Successfully and the parameter can be setted as {param}".format(param=param)
    if __name__ == "__main__":
        choices = {
            'func1': func1,
            'func2': func2,
        }
    
        parser = argparse.ArgumentParser(description='You can use -h option to see the details of this application')
        parser.add_argument('choice',choices=choices, help='you can choose one of the parameter you want, func1, or func2' )
        parser.add_argument('-p', type=int, help='the value you want to attach to the function you want to run.')
        args = parser.parse_args()
    
        print type(args)
        print args
        print args.choice, args.p
        function = choices[args.choice]
        function(args.p)
    

    용도


    우아한 함수의 이 특성에 관해서는 사실 활용되는 곳이 많다.가장 자주 사용하는 것은 사용자가 스크립트의 운행 방식을 결정하도록 하는 것이다.특히 스크립트에는 비슷한 함수 구조가 있지만 기능이 완전히 다르면 더욱 실용적이다.
    예를 들어 플러그인이 서버와 클라이언트를 실현할 때 필요한 매개 변수는 대체로 비슷하다(다른 부분은argparse의add argument 방법으로 추가 지정을 할 수 있다).스크립트를 작성할 때 한 스크립트에 쓰는 것을 고려할 수 있다. 이렇게 하면 양자의 유사성과 차이점을 더욱 잘 나타내고 플러그인에 대해 더욱 깊은 인식을 가지게 된다.

    플러그인 프로그래밍 시 활용

    import argparse, socket
    from datetime import datetime
    
    MAX_BYTES = 65535
    
    def server(port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind(('127.0.0.1', port))
        print 'Listening at {}'.format(sock.getsockname())
        while True:
            data, address = sock.recvfrom(MAX_BYTES)
            text = data.decode('ascii')
            print 'the client at {} says {!r}'.format(address, text)
            text = 'your data was {} bytes long!'.format(len(data))
            data = text.encode('ascii')
            sock.sendto(data, address)
    
    
    def client(port):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        text = 'the time is {}'.format(datetime.now())
        data = text.encode('ascii')
        sock.sendto(data, ('127.0.0.1', port))
        print 'the OS assigned me the address {}'.format(sock.getsockname())
        data, address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print 'The server replied {!r}'.format(address, text)
    
    
    if __name__ == '__main__':
        choices = {
            'client': client,
            'server': server
        }
        parser = argparse.ArgumentParser(description='send and receive UDP locally!')
        parser.add_argument('role', choices=choices, help='which role to play')
        parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')
    
        args = parser.parse_args()
        function = choices[args.role]
        function(args.p)
    
    

    이렇게 하면 스크립트를 실행할 때 선택성을 가질 수 있다.

    총결산


    하나의 함수를 어떻게 우아하게 운행하는지에 관해서, 여기에 관련된 것은 그야말로 빙산의 일각과 같다.
    더 많이 배우려면 고품질의 코드를 많이 읽어야 한다.다행히도 GitHub은 우리에게 이런 좋은 플랫폼을 제공해 주었다.

    좋은 웹페이지 즐겨찾기