0

내 프로그램의 기본 기능과 관련된 특정 인수를 argparse 내에 입력하려고합니다. 그러나 두 가지 문제가 있습니다.argparse : 모두 배타적이지 않고 모두 선택 적이 지 않은 args 그룹을 요구하는 방법은 무엇입니까?

  1. 모든 인수가 상호 배타적 인 것은 아닙니다.
  2. 상호 배타적 인 그룹이더라도 상호 배타적 인 그룹 은 인수가 선택적이어야하며 기본 함수 search (반드시 필요하지 않음)은 위치 인수를 사용합니다.

이상적으로는 'search'이 기본 기능이라고 생각합니다. 그렇기 때문에, 나는 그 주장이 위치에 올랐 으면 좋겠다. 그래도 search이 필요하지 않습니다.. , 그것은 그 자체로 호출되면

  • : search, --name, --list, --add, --import, --encrypt, --decrypt, --delete-database, --rename-database, --backup

    또한, --name은 상호 배타적 인 옵션하지이며, 다목적의 일종이다 : 그러나 다음 중 적어도 하나가 필요합니다 그 인수 (데이터베이스의 이름)가 아직 존재하지 않는 경우 작성됩니다.

  • (데이터베이스)가 존재하는 경우
  • , 그것으로 호출 어떤 다른 옵션의 기능에 대한 인수로 사용됩니다 --name이없는 경우, 예를 들어,
  • -n myfirstdb --decrypt은, 반면에, 내가 가장 최근에 액세스 데이터베이스를 가정합니다.

현재, 나는 기본 옵션 중 하나를 호출 한 경우 --name의 존재 여부에 대한 테스트와 함께,보고, 부담이되기 시작하는 검사를 실행해야합니다.

마지막으로 분명히 상호 배타적 인 옵션을 함께 사용할 수 없습니다.

search을이 필수 배타적 그룹에 속하게하려면 어떻게해야합니까? 그리고 --name도이 필수 그룹 중 하나가되게 할 수 있습니까?

서브 파서를 실험하고 있지만 문제가 해결되었는지 확실하지 않습니다. 어떤 제안이라도 며칠간의 시행 착오를 피할 수 있으며 크게 감사하겠습니다.

parser.add_argument(
    'search', nargs='*', type=str, metavar='S', help='search [field] for string(s)') 
parser.add_argument(
    '--name', '-n', type=str, help='name of the database; created if does not exist') 

main_ex_group = parser.add_argument_group(
    title='main functions').add_mutually_exclusive_group() 
main_ex_group.add_argument(
    '--list', '-l', action='store_true', help='list databases') 
main_ex_group.add_argument(
    '--add', '-a', action='store_true', help='add new record to database') 
main_ex_group.add_argument(
    '--import','-i', dest='include', metavar='PATH', type=str, 
    help='import file(s) at PATH') 
main_ex_group.add_argument(
    '--encrypt', action='store_true', help='encrypt database') 
main_ex_group.add_argument(
    '--decrypt', action='store_true', help='decrypt database') 
main_ex_group.add_argument(
    '--delete-database', metavar='NAME', type=str, 
    help='delete a database') 
main_ex_group.add_argument(
    '--rename-database', nargs=2, metavar='NAME', type=str, 
    help='rename a database') 
main_ex_group.add_argument(
    '--backup', nargs=2, metavar='NAME DEST', type=str, 
    help='copy database to destination') 


import_group = parser.add_argument_group(title='options for import') 
import_group.add_argument(
    '--parse-fields', action='store_true', 
    help='extract keys/fields from included file(s); used as columns') 
import_group.add_argument(
    '--delimiter', metavar='S', default='::', help='key-value separator') 
+1

argparse에는 아무 것도 없습니다. 직접 논리를 작성해야합니다. –

+0

간결하고 명확한 대답을 해주셔서 감사합니다. – GH05T

답변

4

argparse에는 두 개의 그룹화 도구 만 있습니다. 상호 배타적 인 그룹 및 서브 파서. MEG는 모든 작업에 대해 xor입니다. 그룹 자체가 필요할 수도 있지만 모든 작업은 선택적이어야합니다. 대부분 플래그가 지정되어야하지만 (선택적 옵션) 위치는 '선택 사항'일 수 있습니다 (예, 용어가 혼란 스러울 수 있음).

중첩 그룹에 대한 조항이 없으며 다른 로직 (및 또는 기타 등등)에 대한 조항이 없습니다. 그것들은 요청 받았고 나는 패치 작업을 해왔지만 어디에도 가까이 있지 않습니다. 실제로 테스트 자체는 어렵지 않습니다. 그룹을 명확한 방법으로 정의하는 것은 사용법을 표시하는 것처럼 어렵습니다. 중첩을 허용하고 모든 논리적 가능성을 고려하면 추가 코드의 양이 크게 늘어납니다.

지금은 최상의 선택은 구문 분석이 완료된 후 직접 테스트하는 것입니다. 알맞은 기본값 (예 : 기본 기본값 None)을 사용하는 한 어렵지 않습니다.

'seen_actions`라는 내부 변수가 있는데이 테스트에 사용하는 것이 좋겠지 만 저는 여러분과 같은 프로그래머가 사용할 수있는 쉬운 방법을 찾지 못했습니다. 그룹을 확장하기위한 나의 초기 아이디어는이 변수에 대한 액세스와 함께 파싱이 끝날 때까지 자신의 함수를 실행할 수있는 후크를 만드는 것이 었습니다.

사이드 바에있는 이전 답변을보십시오.


argument group은 도움말 도구입니다.이 도구는 도움말 라인을 그룹화합니다. 인수 그룹에 상호 배타적 인 그룹을 중첩 할 수 있습니다. MEG에 효과적으로 제목/설명을 제공하고 인수를 함께 표시합니다. 그러나 이는 usage 또는 테스트에 영향을주지 않습니다. 그리고 다른 방법으로 중첩하는 것은 의미가 없습니다. MEG에 중첩 된 MEG도 가능하지만 그 효과는 모든 작업을 하나의 큰 그룹에 넣고 사용법을 엉망으로 만드는 것입니다 (최근 Python 버그/문제 참조). 존재하는 중첩은 디자인보다 클래스 상속의 특징입니다.


나는 또한 사람들을 부탁

, 어떻게 당신이 usage 라인에서 그룹 (들)을 표현하는 것? 요구 사항은 usage으로 표현하기가 어렵지만 argparse에 구현하기가 어렵습니다.

+0

나는 논리를 직접하는 것을 꺼리지 않는다. 나는 이제 막 중대한 점검을 할 생각이었고, 이제는 'argparse'로 내 목표를 달성 할 수 있는지 여부를 되돌아 볼 수있는 좋은 시간이 될 것이라고 생각했습니다. 답장을 보내 주셔서 감사합니다 (많은 부분이 내 이해력을 넘어선 경우에도 :) 나는 아직 확실한 답을 얻었습니다.) – GH05T

+0

질문에 다시 답하고 좀 더 구체적인 수정 사항을 제시하면 의견을 통해 알려 드리겠습니다. – hpaulj