2013-09-04 9 views
20

के साथ एक तर्क के रूप में एक शब्दकोश को स्वीकार करना मैं argparse के साथ प्रकार = dict के तर्क को स्वीकार करने की कोशिश कर रहा हूं लेकिन इनपुट से कोई फर्क नहीं पड़ता कि यह अमान्य dict value मान की त्रुटि देता है।Argparse और Python

#!/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

"किसी भी वस्तु का समर्थन करता है कि ऑपरेटर में विकल्प मान के रूप में पारित किया जा सकता है, तो dict वस्तुओं, सेट वस्तुओं, कस्टम कंटेनर, आदि सभी समर्थित हैं।"

+0

लिए :) लाइन आप बोली से प्रलेखन से संबंधित है की जरूरत है "विकल्प" कीवर्ड तर्क, जो परिभाषित करता है कि तर्कों के मूल्यों की अनुमति है। पसंद के लिए एक नियम पास करना चाबियों की एक सूची को पारित करने के लिए प्रभावी रूप से बराबर है। इस प्रकार, "{'a': 2, 'b': 3} गुजरने से" आपके "--mydict" ध्वज "ए" या "बी" में अनुमत तर्कों को प्रतिबंधित कर दिया जाएगा। –

उत्तर

26

मुझे नहीं लगता कि कमांड लाइन में एक तर्क के रूप में एक शब्दकोश को पास करना संभव है क्योंकि स्ट्रिंग से dict (EDIT पर एक रूपांतरण फ़ंक्शन मौजूद नहीं है: एक हैक संभव है, नीचे देखें)। क्या आप अनिवार्य रूप से करने के लिए अजगर कह रहे है:

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

अगर आप इसे अजगर कंसोल में बाहर की कोशिश कौन सा, काम नहीं करता।

क्या वाक्यांश:

"किसी भी वस्तु का समर्थन करता है कि ऑपरेटर में विकल्प मान के रूप में पारित किया जा सकता है, तो dict वस्तुओं, सेट वस्तुओं, कस्टम कंटेनर, आदि सभी समर्थित हैं।"

संदर्भित करता है विकल्पों तर्क यह है कि add_argument समारोह के साथ पारित किया जा सकता है - प्रकार तर्क के लिए नहीं।

parser.add_argument('-m', '--my-dict', type=str) 
args = parser.parse_args() 

import json 
my_dictionary = json.loads(args.my_dict) 

फिर आप एक स्ट्रिंग के रूप में एक शब्दकोश पारित कर सकते हैं:

आपका सबसे अच्छा शर्त शायद एक स्ट्रिंग के रूप में अपने तर्क को स्वीकार करने और उसके बाद अजगर की json क्षमताओं का उपयोग कर इसे परिवर्तित करने के लिए है। आप 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 सिर्फ एक समारोह के रूप में पैरामीटर मान का उपयोग करेगा तर्क कन्वर्ट करने के लिए वास्तव में काफी दिलचस्प है। यानी अगर टाइप = int तो यह int (arg) का उपयोग करेगा या टाइप = json.loads तब जेसन।भार (आर्ग)

यह भी मतलब है कि आप टाइप और कस्टम रूपांतरण प्रदर्शन करने के लिए किसी भी समारोह जो तर्क के रूप में में एक भी पैरामीटर लेता है पारित कर सकते हैं आप

+20

'type = json.loads' काम करता है – hpaulj

+1

जैसा कि मैंने उपर्युक्त उल्लेख किया है, वास्तव में बहुत अधिक समझ में आता है, प्रकार को पारित पैरामीटर को ब्रांड्स में तर्क डालकर संभाला जाता है। यह बात बताने के लिए धन्यवाद। –

+0

मैं जरूरी नहीं कि एक "हैक" कहूं। वास्तव में यह कैसे तर्क तर्क काम करना चाहिए – mdw7326