2017-09-05 1 views
0

그래서 내 인수 구문 분석 함수가 더 깨끗한 디자인으로 분리 된 스크립트가 있습니다. 궁극적으로, 나는 하나의 명령을 실행하고 그 3 개의 함수에 의해 모든 인수를 파싱하고 싶다. 모든 인수가 인식하는 첫 번째 인수 구문 분석 함수에 의해 무시 여분의 인수가 두 번째 인수로 전달받을 수 있도록, 내가 스크립트를 설정 한 위해서는ArgumentParser를 통해 추가 인수 전달

python3 rhize_refactored.py -l <str>, -sa, [-cr], -si <int>, -i <input_path>, -o <output_path>, [-r], [-c]

:이 명령은 같을 것이다 파싱 ​​함수, 세 번째 인자 파싱 함수로 다시 호출한다. 그 부분은 다음과 같습니다 :

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], type=str, default='bash') #required 

    args, extras1= parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args 
    return extras1 

def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('-sa', action='store_true') #required 
    parser=parser.add_argument('-cr', action='store_true') #optional 
    parser=parser.add_argument('-si', type=int) #required 
    parser=parser.add_argument('-i') #required 
    parser=parser.add_argument('-o') #required 

    args=parser.parse_args(argv =extras1) 
    extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args 
    return extras2 

def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') #optional 
    parser.add_argument('-c', action= 'store_true') #optional 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(): 
    args, extras1= parse_args_language() 
    parse_args_bash(extras1) 
    make_templates() 
    .... 

def make_templates(): 
    args, extras2= parse_args_bash() 
    parse_args_repo(extras2) 
    ... 

def main(): 
    language= parse_args_language() 
    if language == "bash": 
     rhize_bash() 
    if language == "python": 
     rhize_python() #omitted from this post 

    print("Completed the run.") 
main() 

올바른 방법으로 설정 했습니까? 왜냐하면 나는 전체 스크립트를 실행하려고 할 때 그것이 완전히 없어야한다는 것을 알았음에도 불구하고 그것을 완전히 실행하는 것처럼 보입니다.

+0

당신은이 함수를 호출하는 코드를 생략했지만, 나는 그것이 무엇을하는지 추측 할 수 있습니다. '완전히 실행'하면 3을 모두 부르는 것입니까? 'extras'리스트가 비어 있는지 여부를 체크하지 않는 이상 정상적으로 들립니다. – hpaulj

+0

예, 죄송합니다. 나머지 코드는 꽤 길고 복잡하기 때문에 여기에 모두 게시하고 싶지는 않습니다. 하지만 네, main() 섹션의 끝 부분에 print 명령문이 있습니다 (3 개의 함수를 호출하는 것을 포함하여). 명령 행에 몇개의 인수가 포함되어 있어도 인쇄합니다. 그렇지 않아야한다. – claudiadast

+0

전체 코드를 제공 할 필요는 없지만 기능 자체만으로는 호출 방식이나 호출 방식을 결정할 수 없습니다. 실제로 함수에는 return 문 (또는 args 및 extras)이 중요한 것이 없습니다. – hpaulj

답변

0

다음은 코드 흐름을 올바르게 작성하기위한 시도입니다. 나는 그것을 시험하지 않았다.

#Argument parsing functions# 
def parse_args_language(): 
    parser=ArgumentParser(prog= 'rhize.py') 
    parser.add_argument('-l', dest='language', choices= ['bash', 'python'], default='bash') 

    args, extras1 = parser.parse_known_args() #pass extras down to parse_args_bash() 
    return args, extras1 # return a tuple of items 


def parse_args_bash(extras1): 
    parser=ArgumentParser() 
    parser=parser.add_argument('--sa', action='store_true') 
    # store_true actions are always optional 
    parser=parser.add_argument('--cr', action='store_true') 
    parser=parser.add_argument('--si', type=int) 
    parser=parser.add_argument('-i') 
    parser=parser.add_argument('-o') 

    args, extras2= parser.parse_known_args() #pass extras down to parse_args_repo 
    return args, extras2 


def parse_args_repo(extras2): 
    parser= ArgumentParser() 
    parser.add_argument('-r', action= 'store_true') 
    parser.add_argument('-c', action= 'store_true') 

    args=parser.parser_args(argv=extras2) 
    return args 

    ############################################################## 

def rhize_bash(extras1): 
    args1, extras2 = parse_args_bash(extras1) 
    make_templates(extras2) 
    .... 

def make_templates(extras2): 
    args2 = parse_args_repo(extras2) 
    ... 

def main(): 
    args, extras1 = parse_args_language() 
    if args.language == "bash": 
     rhize_bash(extras1) 
    elif args.language == "python": 
     rhize_python(extras1) #omitted from this post 

    print("Completed the run.") 

if __name__ == "__main__": 
    main() 

parse_args_bashparse_args_repo 반환 별도의 args 공간 객체. argsparse_args_repo에 전달하고 그 값을 추가 할 수 있습니다. 하지만 지금은 그 단계를 건너 뛸 것입니다.

코드는 parse_args_language 번, args.language 값을 얻으려면 한 번, extras1을 전달하려면 한 번. 그렇게해도 해를 끼치 지 않지만, 한 번만 호출되도록 다시 작성합니다. 그것은 단지 -l 인수를 무시하는 것이기 때문에

parse_known_args을 사용하고 있기 때문에이 parse_args_bash는 기본 sys.argv를 사용하여 작동합니다. 그러나 extras으로 작업해도 괜찮습니다.

관련 문제