Python 프로그램을 고도로 구성 가능하게 만드십시오.

프로그램이 복잡할수록 동작을 조정하기 위해 더 많은 매개변수를 받아들이는 경향이 있습니다. 구성 가능한 프로그램은 사용자(및 귀하 자신)의 요구에 더 쉽게 적응할 수 있으며 특정 항목을 변경하려는 경우 수정해야 하는 코드의 양을 줄입니다.

코드에서 매개변수를 지정하는 세 가지 방법이 있습니다.
  • 소스 코드에서 직접.
  • 별도의 구성 파일 내부.
  • 명령줄의 인수를 사용합니다.

  • 각각은 이전 매개변수를 재정의해야 합니다. 이것을 어떻게 깔끔하게 구현합니까?

    1. 모든 매개 변수를 별도로 가져옵니다.



    소스 코드에서



    이것은 설명이 필요 없습니다. 기본 구성은 하드 코딩되어 있습니다.

    default_config = {
        "mode": "demo",
        "timeout": 5,
        "color": blue,
        "language": "en"
    }
    

    구성 파일에서



    사용자 지정 구문 분석 기능에서 configparser과 같은 라이브러리에 이르기까지 구성 파일을 읽는 방법은 무수히 많습니다. 당연히 선택에 따라 파일의 형식이 결정되며 각각의 장단점이 있습니다.

    이를 간단하게 유지하기 위해 일반 JSON 파일을 사용합니다.

    import json
    
    with open("config.json", "r") as f:
        file_config = json.load(f)
    

    명령줄에서



    다시 말하지만 명령줄에서 인수를 구문 분석하는 방법에는 여러 가지가 있습니다. 가장 확장된 것은 argparse 이라고 생각합니다. 유연하고 자동 생성된 도움말 메시지 등과 같이 일반적으로 예상되는 많은 동작을 직접 구현하기 때문입니다.

    그러나 이와 같은 예제에서는 코드가 너무 길어지므로 사용자 정의 코드를 사용하여 --key=value 형식의 인수를 구문 분석하겠습니다.

    import sys
    
    params = filter(lambda x: x[:2] == "--", sys.argv)
    params = map(lambda x: x.split("="), params)
    cli_config = {k[2:]: v for [k,v] in params}
    

    2. 하위 수준에 있는 값 재정의



    Python에서 이중 별표( ** ) 연산자는 사전의 압축을 푸는 데 사용됩니다. 다른 곳에서 사용할 키-값 쌍을 추출합니다.

    이 연산자의 가장 흥미로운 용도 중 하나는 사전을 병합하여 압축 해제된 다른 사전에서 새 사전을 빌드하는 것입니다. 고유한 키만 허용하므로 오른쪽에서 압축을 푼 사전이 왼쪽에서 반복되는 값을 대체합니다.

    final_config = {**default_config, **file_config, **cli_config}
    

    예시



    우리가 가진 것을 모아 봅시다:

    main.py

    import sys
    import json
    
    ## default
    default_config = {
        "mode": "demo",
        "timeout": 5,
        "color": "blue",
        "language": "en"
    }
    
    print("default", default_config)
    
    ## file
    with open("config.json", "r") as f:
        file_config = json.load(f)
    
    print("file   ", file_config)
    
    ## command line
    params = filter(lambda x: x[:2] == "--", sys.argv)
    params = map(lambda x: x.split("="), params)
    cli_config = {k[2:]: v for [k,v] in params}
    
    print("cli    ", cli_config)
    
    ## merge them
    final_config = {**default_config, **file_config, **cli_config}
    
    print("final  ", final_config)
    

    config.json

    {
        "color": "red",
        "timeout": 10
    }
    

    산출



    $ python main.py --color=green --language=es
    default {'mode': 'demo', 'timeout': 5, 'color': 'blue', 'language': 'en'}
    file    {'color': 'red', 'timeout': 10}
    cli     {'color': 'green', 'language': 'es'}
    final   {'mode': 'demo', 'timeout': 10, 'color': 'green', 'language': 'es'}
    

    결론



    프로그램을 구성 가능하게 만들면 많은 작업이 더 쉬워집니다. 사용자(및 개발자 자신)가 소스 코드를 수정하지 않고 애플리케이션의 일부를 영구 및 동적으로 사용자 지정하도록 허용하는 것은 항상 차이를 만듭니다.

    추천도서







    좋은 웹페이지 즐겨찾기