2013-09-04 23 views
20

Ben argidse ile type = dict argümanını kabul etmeye çalışıyorum ama girdikten sonra geçersiz bir dict değeri hatası veriyor.Argparse ve python ile argüman olarak bir sözlüğü kabul etme

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

Bu deneyin ve bunun mümkün olacağını düşünürdüm belgeler baktığımızda komut

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

için bir sözlük geçirdiğinizde neler olduğunu.

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

“vb böylece dict nesneleri kümesi nesneleri, özel kaplar, operatör içinde seçimler değeri olarak geçirilebilir destekleyen herhangi bir nesne tüm desteklenmektedir.”

+0

Eğer alıntı hattı :) gerekiyorsa tip ve özel dönüşümleri gerçekleştirmek için bağımsız değişken olarak tek bir parametre alan bir fonksiyon geçmesi anlamına gelir argümanların hangi değerlerine izin verildiğini tanımlayan "seçimler" anahtar kelime argümanı. Seçime bir kural atmak, anahtarların bir listesini geçmeye etkili bir şekilde denktir. Böylece, "{'a': 2, 'b': 3}" ifadesi, "--dict" işaretine izin verilen argümanları "a" veya "b" ye sınırlar. –

cevap

26

sanmıyorum dizeden dict'e (EDIT:hacki hakikati mümkündür, aşağıya bakınız) bir dönüştürme işlevi olmadığından, bir komutu argüman olarak komut satırında geçirmek mümkündür. Ne temelde yapmak piton anlatıyorsun şudur: piton konsolunda bir denerseniz, çalışmıyor

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

.

ifade Ne:

"herhangi bir nesne, vb yüzden dict nesneleri kümesi nesneleri, özel kaplar, operatör içinde seçimler değeri olarak geçirilebilir desteklediği tüm desteklenmektedir." olup tip argüman -

add_argument fonksiyonu ile geçirilebilir seçenek argümandır belirtmektedir.

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

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

Daha sonra bir dize biçiminde bir sözlük geçirebilirsiniz:

Yapabileceğiniz en iyi şey, muhtemelen bir dize olarak argüman kabul edip pitonun json özelliklerini kullanarak dönüştürmek etmektir.

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

DÜZENLEME: hpaulj size göre tip parametresi "kesmek" anlamına bana işaret etti nasıl çalıştığını Sen görmek için piton konsolunda kendiniz için json kodlayıcı/kod çözücüyü deneyebilir json.loads. içten sadece argüman dönüştürmek için bir işlevi olarak parametre değeri kullanır argparse çünkü

import json 
parser.add_argument('-d', '--my-dict', type=json.loads) 
args = parse.parse_args() 

mydict = args.my_dict # Will return a dictionary 

bu işleri nedeni aslında oldukça ilginçtir. yani, eğer type = int ise int (arg) veya type = json.loads, sonra json kullanacaktır.yükler (arg)

Bu da belgeler ile ilgilidir den

+20

'type = json.loads' çalışır – hpaulj

+1

Yukarıda bahsettiğimden beri, çok fazla anlam ifade ederse, türüne geçirilen parametre, bağımsız değişkeni parantez içine yerleştirerek işlenir. Bunu işaret ettiğin için teşekkürler. –

+0

Buna mutlaka "hack" diyemezdim. Aslında tür argümanının nasıl çalıştığı tahmin ediliyor – mdw7326

İlgili konular