2012-06-18 2 views
2

이와 같은 인수 파서를 사용할 수 있습니까?. argparse 인수 및 변수 이름에 점 (점)

import argparse 
parser.add_argument('query2target.bam', help='A bam file containing contigs from \'query\' aligned to contigs in \'target\'') 
args = parser.parse_args() 
q2t = args.query2target.bam 

나는 파서의 이름은 'query2target.bam'하지만 나는 그것이, q2t = args.query2target.bam 그것을 확장 함수 방법이라고 생각 후 변수의 이름을 갈 때 싶어요. 인수의 이름을 바꾸지 않고 어떻게 해결할 수 있습니까?

답변

1

내 이전 답변을 염두에 두지 마십시오. 실제로이 문제에 대한 깨끗한 해결책이 있습니다. ArgumentParser에 대한 custom action를 작성 :

import argparse 

class Q2TAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string): 
     self.query2target = values 

parser = argparse.ArgumentParser() 
q2taction = parser.add_argument("query2target.bam", action=Q2TAction) 
parser.parse_args() 

print(q2taction.query2target) 
+0

'getattr'을'악용하는 것 '으로 괜찮 았지만 청소기가 항상 좋았습니다. 이것은 훨씬 좋은 해결책입니다, 감사합니다 larsmans. –

2

파이썬은 이름이 점을 포함와 속성을 가질 수 실제로 객체.

>>> print args.__dict__ 
{'query2target.bam': 'your-argument-value'} 

당신은 쉽게 getattr() 내장 함수를 사용하여이 속성의 값을 추출 할 수 있습니다 :

q2t = getattr(args, 'query2target.bam') 

을하지만 여전히 아마 더 나은 당신은 그들처럼 보인다하여 args 변수의 __dict__ 속성을 인쇄 볼 수 있습니다 국제 대회에 충실하기.

+0

이 내가 원하는 무엇 쿨 ... 당신이 위치 인수의 이명 령 매개 변수를 사용할 수 있다고 생각하지 않습니다. 나는 대회에 충실해야한다는 것을 알고 있지만, '점'을 볼 수 있으면 파일이 특정 형식이어야한다는 사실을 모든 사람들이 쉽게 이해할 수 있습니다. 사람들은 서면 지시를 무시하는 경향이 있지만. 확장은 보편적이며 무의식적으로 당신의 두뇌는 그것을 더 잘 IMO에 등록합니다. –

+1

이것은 끔찍한 일입니다. @ 단 : 이름에 점을 정말로 넣고 싶다면'getattr'을 악용하는 대신'dict'을 사용하십시오. –

+0

@larsmans, agree - not pretty -하지만 "인수의 이름을 바꾸지 않고". 또한 API가 제공 한 API 만 사용할 수 있습니다. –