2012-05-16 3 views
0

여러 개의 입력 파일이 있으며 대소 문자 ".1", ".2"등으로 구분하여 구분합니다. 나는이 파일들에 대해 작동하는 스크립트를 만들고 있는데, argparse를 사용하여 사용자가 특정 케이스 번호를 지정하도록하거나, "_"를 사용하여 마지막으로 저장된 케이스를 지정한다. 최대 케이스 번호). 뭔가가 좋아.argparse 선택을 사용하여 유형 및 패턴 지정

> ls 
    file.1, file.2, file.3 
> my_script.py 2 
    (operates on file.2) 
> my_script.py _ 
    (operate on file.3) 

"임의의 정수"를 하나의 선택 사항으로 지정하고 "_"를 두 번째 선택 사항으로 지정할 수있는 방법이 있습니까? 뭔가가 좋아.

parser = argparse.ArgumentParser() 
parser.add_argument('case', choices=[anyint, '_']) 

답변

5

는 대신 add_argument(...)type 인수를 사용할 수 있습니다. 예를 들면 :이 프로그램을 실행할 때

import os 
import argparse 

def intOrUnderscore(s): 
    if s != '_': 
     return int(s) 
    cases = (n for n in os.listdir(".") if n.startswith("file.")) 
    return max(int(c[c.rindex(".")+1:]) for c in cases) 

parser = argparse.ArgumentParser() 
parser.add_argument('case', type=intOrUnderscore) 

args = parser.parse_args() 
print args.case 

내가 얻을 :

$ ls 
file.1 file.2 file.3 s.py 
$ python s.py 2 
2 
$ python s.py _ 
3 

다른 방법으로, 당신은 코드에서 선택 목록을 만들 수 :

import os 
import argparse 

cases = [n[n.rindex(".")+1:] for n in os.listdir(".") if n.startswith("file.")] 
cases.append("_") 
parser = argparse.ArgumentParser() 
parser.add_argument('case', choices = cases) 

args = parser.parse_args() 
print args.case 
+0

우수한. 옵션 # 1 (intOrUnderscore 함수 정의)을 사용했으며 매력처럼 작동합니다. 감사! – jeremiahbuddha