2017-11-10 11 views
4

몇 가지 인수를 구문 분석하고 값 비싼 가져 오기가있는 스크립트가 있지만 사용자가 유효한 입력 인수를 제공하는 경우에만 해당 가져 오기가 필요합니다. 그렇지 않으면 프로그램이 종료됩니다. 또한 사용자가 python script.py --help이라고 말하면 값 비싼 가져 오기를 전혀 실행할 필요가 없습니다. 나는 그런 스크립트 생각할 수비싼 수입 전에 파이썬에서 argumens를 우아하게 구문 분석하는 방법은 무엇입니까?

:

import argparse 

def parse_args(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('--argument', type=str) 
    args = parser.parse_args() 
    return args 

if __name__ == "__main__": 
    args = parse_args() 

import gensim # expensive import 
import blahblahblah 

def the_rest_of_the_code(args): 
    pass 

if __name__ == "__main__": 
    the_rest_of_the_code(args) 

이이 일을하지만, 나에게 우아한 보이지 않는다. 작업에 대한 더 좋은 제안이 있습니까?

편집 : 가져 오기가 정말 비싸다 :

$ time python -c "import gensim" 
Using TensorFlow backend. 

real 0m12.257s 
user 0m10.756s 
sys 0m0.348s 
+0

는 다른 모듈에 넣습니다. – Elazar

+0

또한 수입이 왜 비쌉니까? – Elazar

+0

그것은 tensorflow를로드하고 NLP 모듈을 준비하기 위해 일련의 코드를 실행합니다. – adrin

답변

8

당신은 조건부로 수입 또는 try 블록, 또는 어느 곳에서나 코드에서 할 수 있습니다.

import cheaplib 

if __name__ == "__main__": 
    args = parse_args() 
    if expensive_arg in args: 
     import expensivelib 
    do_stuff(args) 

심지어 더 명확하게는, 단지 그것을 사용하는 기능에 lib 디렉토리를 가져옵니다

그래서 당신이 뭔가를 할 수 있습니다. 당신이 이미 가지고있는 것보다 더 나은,하지만 당신은 게으르게로드 할 수 있는지

def expensive_function(): 
    import expensivelib 
    ... 
+0

내 대답보다 낫다. – Elazar

3

하지 :

def load_gensim(): 
    global gensim 
    import gensim 

만 인수가 의미가 있는지 확인하려면, 당신은 래퍼 main 모듈을 가질 수 있습니다 인수를 확인한 다음 다른 모듈을로드하고 호출합니다.

main.py :

args = check_args() 
if args is not None: 
    import mymodule 
    mymodule.main(args) 

mymodule.py :

import gensim 
def main(args): 
    # do work