2012-05-25 4 views
10

argparse는 모호하지 않은 경우에 기본 약어를 사용합니다.argparse에서 약어 사용 안 함

약자를 원하지 않아 사용을 중지하고 싶습니다. 그러나 documentation에서 찾지 못했습니다.

가능합니까?

예 :

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--send', action='store_true') 
parser.parse_args(['--se']) # returns Namespace(send=True) 

하지만 전체 매개 변수가 제공되는 경우에만 사실로합니다. 사용자 오류를 방지합니다.

업데이트 :

나는 카스 응답 후 ticket at python bugtracker를 만들었습니다. 그리고 이미 처리되었습니다.

답변

5

파이썬 3.5 이후.0 다음으로 ArgumentParser를 시작하여 약어를 사용하지 않도록 설정할 수 있습니다 :

parser = argparse.ArgumentParser(allow_abbrev=False) 

또한 the documentation를 참조하십시오.

+0

원래 질문은 3 년이 넘었지만 오늘은 정답입니다. – jdferreira

+0

나는이 질문에 답하기 때문에 정답으로 선택합니다. – jens

3

아니요, 분명히 이것은 불가능합니다. Python 2.7.2 이상.

먼저, 설명서를 살펴 보았습니다. 아무 소용이 없었습니다.

그런 다음 Lib \ argparse.py를 열고 소스 코드를 살펴 보았습니다. 많은 세부 사항을 생략하면, (: 2152 argparse) : 각 인수는 다음과 같은 정규 표현식 구문 분석 할 것 같다 '-'와 '-'

# allow one or more arguments 
    elif nargs == ONE_OR_MORE: 
     nargs_pattern = '(-*A[A-]*)' 

이 정규식은 모두를 성공적으로 분석됩니다, 그래서 우리는이 짧고 긴 인수를 제어하지 못합니다. 다른 정규 표현식도 - * 구조를 사용하므로 매개 변수의 유형 (하위 인수 없음, 하위 인수 등)에 의존하지 않습니다.

나중에 코드에서 더블 대시는 사용자가 제어 할 수있는 플래그없이 다시 (만 비 선택적 인수에 대한) 하나의 대시로 변환됩니다

# if this is an optional action, -- is not allowed 
    if action.option_strings: 
     nargs_pattern = nargs_pattern.replace('-*', '') 
     nargs_pattern = nargs_pattern.replace('-', '') 
+1

좋은 연구 :) –

+0

나는 문제가 짧고 긴 옵션과 관련이 있다고 생각하지 않습니다. – Vikas

4

아니, 잘되지 추한 해킹없이.

코드 스 니펫 @Vladimir이 게시했습니다. 사용자가 찾고있는 코드가 아닌 것 같습니다. 이 작업을 수행하는 실제 코드는 다음과 같습니다

def _get_option_tuples(self, option_string): 
    ... 
    if option_string.startswith(option_prefix): 
    ... 

이 검사가 startswith하지 == 발생한다.

그리고 언제든지 argparse.ArgumentParser을 확장하여 자신의 _get_option_tuples(self, option_string)을 제공하여이 동작을 변경할 수 있습니다. I는 option_string == option_prefixoption_string.startswith(option_prefix) 두 발생을 1,8- 의해 않았다주의

있어서 _get_option_tuples 전형적 파이썬 전용 방법을 의미 _, 접두어의

>>> parser = my_argparse.MyArgparse 
>>> parser = my_argparse.MyArgparse() 
>>> parser.add_argument('--send', action='store_true') 
_StoreTrueAction(option_strings=['--send'], dest='send', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None) 
>>> parser.parse_args(['--se']) 
usage: [-h] [--send] 
: error: unrecognized arguments: --se 

단어. 그리고 사적인 것을 무시하는 것은 좋은 생각이 아닙니다.

+0

예, 이것이 내가 찾고있는 것이 었습니다. thx – jens

3

파이썬 2.7의 다른 방법. clunky하자! 약어가없는 --dog을 인식하려고한다고 가정 해보십시오. 만 세 번째 편지에서 원하는 인수는 다른 제 2 인수 --dox을 추가함으로써

p = argparse.ArgumentParser() 
p.add_argument('--dog') 
p.add_argument('--dox', help=argparse.SUPPRESS, metavar='IGNORE') 

--d--do이 모호된다. 따라서 파서는이를 인식하지 못합니다. 결과 예외를 catch하고 parse_args을 호출하는 컨텍스트에 따라 처리해야하는 코드를 추가해야합니다. 도움말 텍스트를 표시/비틀어 야 할 수도 있습니다. help=...

은 (this 당) 기본 도움말 메시지의 옵션 목록에서 인수를 유지하고 metavar='IGNORE' 당신이 정말로이 옵션 :)으로 작업을 수행하지 않는 분명히하기 위해 단지이다.

+0

@ 2rs2ts 다른 옵션이 있습니다. – cxw

+0

내 현재 apt repos를 통해 파이썬 3.5에 액세스 할 권한조차 없기 때문에이 코드는 유용 할 것입니다. 감사! – 2rs2ts