2015-06-29 17 views
5

Argpar'dan bir işleve geçmek istediğim birçok olası argümanım var. Değişken ayarlanmamışsa, yöntemin varsayılan değişkenini kullanmasını istiyorum. Ancak, taşıma hangi argümanları ayarlayabilir ve hangi is sıkıcı değil var olan:Python'da argümanların koşullu geçişi

import argparse 
def my_func(a = 1, b = 2): 
    return a+b 

if __name__ == "__main__": 
    parser = argparse.ArgumentParser(description='Get the numeric values.') 
    parser.add_argument('-a', type=int) 
    parser.add_argument('-b', type=int) 
    args = parser.parse_args() 

    if not args.a is None and not args.b is None: 
     result = my_func(a = args.a, b = args.b) 
    elif not args.a is None and args.b is None: 
     result = my_func(a = args.a) 
    elif not args.b is None and args.a is None: 
     result = my_func(b = args.b) 
    else: 
     result = my_func() 

Ben böyle bir şey yapmak mümkün olmalıdır gibi görünüyor:

result = my_func(a = args.a if not args.a is None, b = args.b if not args.b is None) 

Ama bu konuda söz dizimi hatası veriyor virgül.

Argparser'de varsayılan değerleri ayarlayabilirim, ancak yöntem tanımında ayarlanan varsayılanları kullanmak istiyorum.

+2

Yalnızca bir "else" varsa, bir ifadede 'if' kullanabilirsiniz. 'f (a eğer b)' - iyi değil. f (a eğer b else c) '- iyi. – Kevin

cevap

4

Sözlük paketini açma sözdizimini kullanarak bir sözlük kullanın.

args = parser.parse_args() 
result = my_func(**vars(args)) 

Düzenleme

Kullanım ArgumentParser için SUPPRESS argüman kaldırmak için boş değerler:

parser = argparse.ArgumentParser(description='Get the numeric values.', 
           argument_default=argparse.SUPPRESS) 
+0

Bu istediğimi yapmıyor, bu da my_func öğesini None ve None olarak gönderir. –

+0

Sabit, güncellemeye bakın. –

+0

Bu, orijinal sorumu yanıtlıyor, ancak, my_func'un hepsini argparser ile aynı değişkenleri alacağını varsayar. Argparser'de bulunan ek argümanlar varsa, my_func dosyasına aktarılmadan önce kaldırılması gerekir. –

1

bana gelen ilk çözüm işte burada biraz hacky görünüyor ... ama .

Bir işlevin argümanlarına bakan bir işlevi yazmak için10'u kullanın ve yalnızca None kabul edip etmediği bağımsız değişkenleri args'dan geçirin. Benim tahminim eylem olduğunu ... Bu yaygın kötü uygulama olarak kabul edileceğini Burada

import inspect 

def call_function(fn, args): 
    argspec = inspect.getargspec(fn) 
    arglist = {} 
    for arg in argspec.args: 
     if arg in args.__dict__.keys() and args.__dict__[arg] is not None: 
      arglist[arg] = args.__dict__[arg] 
    return fn(**arglist) 

geçerli:

Bu çözüm oldukça altında test edilir ve daha sağlam hale getirmek için çalışmalarını gerekebilir
import argparse 

def my_func(a=1, c=2): 
    return a,c 

a=None 
b=2 
c=3 
args=argparse.Namespace(a=a,b=b,c=c) 

call_function(my_func, args) 

>> (1, 3) 

ama fikir var ve basit durumlarda çalışmalı.