복붙노트

[PYTHON] argparse 및 python을 사용하여 사전을 인수로 허용 [duplicate]

PYTHON

argparse 및 python을 사용하여 사전을 인수로 허용 [duplicate]

argpse와 함께 type = dict의 인수를 받아들이려고하지만 입력에 관계없이 잘못된 dict 값의 오류를 제공합니다.

#!/usr/bin/env python

import argparse

MYDICT = {'key': 'value'}

parser = argparse.ArgumentParser()
parser.add_argument("-m", "--mydict", action="store",
                    required=False, type=dict,
                    default=MYDICT)

args = parser.parse_args()

print args.mydict

사전을 스크립트에 전달하려고 할 때 일어나는 일입니다.

./argp.py -m "{'key1': 'value1'}"
usage: argp.py [-h] [-m MYDICT]
argp.py: error: argument -m/--mydict: invalid dict value: "{'key1': 'value1'}"

문서를 보면 이것이 가능할 것이라고 생각합니다.

http://docs.python.org/dev/library/argparse.html

"in 연산자를 지원하는 모든 객체를 선택 값으로 전달할 수 있으므로 dict 객체, set 객체, 사용자 정의 컨테이너 등이 모두 지원됩니다."

해결법

  1. ==============================

    1.문자열에서 dict (EDIT : 해킹이 가능합니다. 아래 참조)의 변환 함수가 없기 때문에 명령 줄에서 인수를 인수로 전달할 수 있다고 생각하지 않습니다. 근본적으로 파이썬에게 다음과 같이 말합니다 :

    문자열에서 dict (EDIT : 해킹이 가능합니다. 아래 참조)의 변환 함수가 없기 때문에 명령 줄에서 인수를 인수로 전달할 수 있다고 생각하지 않습니다. 근본적으로 파이썬에게 다음과 같이 말합니다 :

    dict("{'key1': 'value1'}")
    

    파이썬 콘솔에서 해보면 작동하지 않습니다.

    무슨 구절 :

    "in 연산자를 지원하는 모든 객체를 선택 값으로 전달할 수 있으므로 dict 객체, set 객체, 사용자 정의 컨테이너 등이 모두 지원됩니다."

    는 add_argument 함수와 함께 전달 될 수있는 choices 인수이며 type 인수는 아닙니다.

    최선의 방법은 아마도 인수로 문자열을 받아 들인 다음 파이썬의 json 기능을 사용하여 변환하는 것입니다.

    parser.add_argument('-m', '--my-dict', type=str)
    args = parser.parse_args()
    
    import json
    my_dictionary = json.loads(args.my_dict)
    

    그런 다음 사전을 문자열 형식으로 전달할 수 있습니다. 파이썬 콘솔에서 json 인코더 / 디코더를 직접 사용해보십시오.

    >>>json.loads('{"value1":"key1"}')
    {u'value1': u'key1'}
    

    편집 : hpaulj 당신이 그것을 "json.loads 전달하여 형식 매개 변수를"해킹 할 수 지적했다.

    import json
    parser.add_argument('-d', '--my-dict', type=json.loads)
    args = parse.parse_args()
    
    mydict = args.my_dict  # Will return a dictionary
    

    내부적으로 argparse가 인수를 변환하는 함수로 매개 변수 값을 사용하기 때문에 이것이 실제로 작동하는 이유는 실제로 매우 흥미 롭습니다. type = int 인 경우 int (arg)를 사용하거나 type = json.loads이면 json.loads (arg)

    즉, 단일 매개 변수를 인자로 취하는 모든 함수를 전달하여 필요할 경우 사용자 정의 변환을 수행 할 수 있습니다.

  2. from https://stackoverflow.com/questions/18608812/accepting-a-dictionary-as-an-argument-with-argparse-and-python by cc-by-sa and MIT license