2017-10-15 8 views
0

저는 OOP에 익숙하지 않아 혼란 스럽습니다. 파이썬 클래스에 argparse 옵션을 어떻게 포장합니까?

현재 내가 가진 :

꽤 잘 작동하지만 내 스크립트의 전체에 대한 클래스를 생성하고 클래스의 방법으로 argparse하기 위해 완
parser = argparse.ArgumentParser(description='script 1.0') 
parser.add_argument('-a', '--foo', help='specify foo') 
parser.add_argument('-b', '--bar', type=int, help='specify bar') 
parser.add_argument('-c', '--baz', help='specify baz') 
parser.add_argument('-d', '--bar2', help='bar2') 

args = parser.parse_args() 

foo = args.foo 
bar = args.bar 
baz = args.baz 
bar2 = args.bar2 

(전혀 가능합니까?).

그래서 나는 시도 :

 import argparse 
     .... 

     Class Program: 
      def __init__(self, foo, bar, baz, bar2): 
       self.foo = foo 
       self.bar = bar 
       ...(so on for each arg) 
      def main(): 
       parser = argparse.ArgumentParser(description='script 1.0') 
       parser.add_argument('-a', '--foo', help='specify foo') 
       parser.add_argument('-b', '--bar', type=int, help='specify bar') 
       parser.add_argument('-c', '--baz', help='specify baz') 
       parser.add_argument('-d', '--bar2', help='bar2') 

       args = parser.parse_args() 

       foo = self.foo 
       bar = self.bar 
       baz = self.baz 
       bar2 = self.bar2 

내가 비록, 바로 일을하고 있다고 생각하지 않습니다. 나는 그것에 대해 너무 많은 정보를 찾지 못했지만 상황을 명확하게하지 않은 SO에 대한 하나의 게시물은 특정 사례에 대한 의견을 갖고 싶습니다.

+0

옳은 길에있는 것처럼 보입니다. 실제로 어떤 문제가 있습니까? – ZdaR

+0

@ZdaR, argparse 옵션이 추가 사용을 위해 기억되지 않아서, 다음과 같이 클래스를 intianalize해서는 안됩니다 : __init __ (self, --foo, --bar, -baz, --bar2) –

+2

나는 우려의 명확한 분리를 갖는 것이 최선이라고 생각한다. 즉, 비즈니스 로직 (프로그램 클래스)에서 CLI 입력을 분리하십시오. 이렇게하려면 스크립트가 직접 실행될 때만 argparse를 사용합니다. 즉,'if __name__ == __main__' 섹션 아래. 그런 다음 argparse가 작업을 완료하면 파싱 된 인수를 전달하는 클래스 인스턴스를 만들고 논리를 실행합니다. – monkut

답변

1

argparse은 이미 클래스를 사용하고 있습니다. argparse.ArgumentParser(...)은 파서 개체를 만듭니다. parser.add_argument(...)Action 개체를 만들고 parser 목록에 넣습니다. 또한 코드로 반환하여 일부 고급 용도로 사용할 수 있습니다. parse_args()argparse.Namespace 개체를 반환합니다.

argparse 클래스를 서브 클래스 화하여 성능을 사용자 정의 할 수 있습니다.

그러나 특별한 동작이 많이 필요한 경우가 아니면 일반적으로 자신의 parser 클래스를 만들 필요가 없습니다.

는 여기에 내가 argparse의 깨끗한 사용을 할 생각 하는데요 내용은 다음과 같습니다

import argparse 

# your code 
def main(args): 
    foo = args.foo 
    # other uses of args 

def other(foo, bar): 
    # code using values 

def make_parser(): 
    parser = argparse.ArgumentParser(description='script 1.0') 
    parser.add_argument('-a', '--foo', help='specify foo') 
    parser.add_argument('-b', '--bar', type=int, help='specify bar') 
    parser.add_argument('-c', '--baz', help='specify baz') 
    parser.add_argument('-d', '--bar2', help='bar2') 
    return parser 

if __name__ == '__main__': 
    parser = make_parser() 
    args = parser.parse_args() 

좋은 생각을하는 기능에 파서 정의입니다 포장. 더 복잡한 경우에는 클래스가 될 수 있습니다. 그러나 일반적으로 스크립트 당 하나의 파서 만 필요하므로 함수만으로 충분합니다. 이 함수는 스크립트 본문에있을 수 있지만 실제 사용은 if __name__ 블록에 있어야하므로 파서를 사용하지 않고 스크립트를 가져올 수 있습니다.

이렇게하면 모든 코드에 액세스 할 수있는 전역 환경에 args 네임 스페이스가 추가됩니다. 당신의 기능에로 전달 될 수있다, 또는 선택한 값이 전달 될 수 있습니다 :

main(args) 
other(args.foo, args.bar) 
foo = args.foo 
do_things3(foo) 
d = vars(args) # args in dictionary form 

가 IT 수입 클래스 및/또는 기능으로 작동되도록하고, 스크립트로 실행할 때 코드를 작성하는 것이 좋습니다. argparse 부분은 스크립트로 실행할 때 값을 설정합니다. 가져올 때 가져 오기 스크립트가 필요한 제어 값을 설정합니다 (가능하면 자체 제어 parser).