2011-11-29 63 views
7

üzerinden değişkenleri Özü:Python: Ben komut argümanlar ayrıştırmak için Python argparse kullanıyorum ad

parser = ArgumentParser() 
parser.add_argument("--a") 
parser.add_argument("--b") 
parser.add_argument("--c") 
args = parser.parse_args() 

Şimdi a, b ve c ile bazı hesaplamalar yapmak istiyorum. Ancak, her zaman args.a + args.b + args.c yazmak için yorucu buluyorum.

Bu nedenle, bu değişkenleri ayıklanması ediyorum: Ben a + b + c yazabilir

a, b, c = [args.a, args.b, args.c] 

Öyle ki. Bunu yapmanın daha zarif bir şekilde

var mı? Birçok argümanlar eklerken

Manuel çıkarma çok sıkıcı ve hata eğilimli olur.

cevap

8

değeriyle yerel kapsamda olmak a sonuçlanacaktır, yapabileceğiniz:

globals().update(vars(args)) 

Eğer' Bu fonksiyonun yerel değişkenler olarak bunları istediğiniz bir işlevi yeniden ve aşağıdaki gibi Python 2.x yapabilirsiniz:

def foo(args): 
    locals().update(vars(args))  
    print a, b, c 
    return 
    exec "" # forces Python to use a dict for all local vars 
      # does not need to ever be executed! but assigning 
      # to locals() won't work otherwise. 

Bu numara exec bir açıklama değildir Python 3, çalışmaz, Jython gibi diğer Python değişkenlerinde veya IronPython.

Genel olarak, olsa, ben sadece args nesne için daha kısa bir ad kullanarak tavsiye veya panosunu kullanmak. :-)

+0

Cevabınız için teşekkürler. Çalışır, ancak "exec" "kısmı çok çirkin bir hack gibi hissettirir. Bu neden gerekli? – Lemming

+0

Düzeltme: İşlev iç içe geçmiş işlevler içeriyorsa çalışmaz. Bu durumda, aşağıdaki hata iletisi açılır: 'exec" " SözdizimiHata: 'ana' işlevinde nitelenmemiş çalıştırmaya izin verilmez variables serbest değişkenlere sahip iç içe geçmiş bir işlev içerir' – Lemming

+0

Ick. Bunu bilmiyordum ama mantıklı. Kapanışlar, lokallere indeksle erişen Python'un standart yerel değişken mekanizmasını gerektirir. 'Exec' ifadesinin bir fonksiyonun herhangi bir yerindeki kullanımı, Python'un yerlilere isme göre alternatif bir yöntem kullanmasını zorunlu kılar, çünkü 'exec' yerlileri tanımlayabilir veya değiştirebilir (bu ayrıca eğer' locals() 'i eğer exec yi de güncelleyebilirsiniz 'işlevde görülür, ancak başka türlü değil. – kindall

0

Sen locals() arayarak yerel kapsamına şeyler ekleyebilir. Mevcut kullanılabilir kapsamı temsil eden bir sözlük döndürür. Siz de buna değer atayabilirsiniz - Sen globaller olarak isterseniz locals()['a'] = 12 12.

+0

Sen halk 'dönüş değeri()' değişiklik yapmamalıdır. Bir etkisi olması garanti edilmez ve genellikle CPython'da yoktur. http://docs.python.org/library/functions.html#locals –

+0

bu 'exec ""' hile olmadan çalışmadığını görünüyor, o kindall belirtti. – Lemming

İlgili konular