2014-04-17 31 views
5

Farklı tiplerdeki çıktı dosyalarını yazmak ve çıktı almak için ortak kod kullanan bir Python betiği var.ArgParse Python Modülü: Varsayılan argüman için varsayılan argüman değerini değiştir

Bunlar kimyasal yapı dosyalarıdır. Bazı örnek dosya türleri .smi veya .sdf olabilir.

Varsayılan olarak, bu komut dosyalarından bazılarının "smi" dosya biçimindeki verileri çıkarmasını ve diğerlerinin "sdf" biçimindeki verileri çıkarmasını istiyorum.

Bir ebeveyn ayrıştırıcısından miras alınan bir argümanın varsayılan değerini geçersiz kılmak mümkün müdür? Örneğin

...

# Inherited code 
filesParser = argparse.ArgumentParser(add_help=False) 
filesParser.add_argument('-o', dest='outformat', default="smi") 

# Script code 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
parser.add_argument('--foo') 

# Something like... 
# parser.outformat.default = "sdf" 

args = parser.parse_args() 

İlk mesaj yani benim görgü Tamam umuyoruz.

Çok teşekkürler, Dave

cevap

5

Evet (docs):

>>> parser.parse_args([]) 
Namespace(foo=None, outformat='smi') 
>>> parser.set_defaults(outformat='sdf') 
>>> parser.parse_args([]) 
Namespace(foo=None, outformat='sdf') 
+0

Çok teşekkürler! Bir süredir etrafa bakıyordum ve farketmedim. – user3544841

2

set_defaults muhtemelen en kolay düzeltmedir.

Ama doğrudan

filesParser = argparse.ArgumentParser(add_help=False) 
outaction=filesParser.add_argument('-o', dest='outformat', default="smi") 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
fooaction=parser.add_argument('--foo') 
print fooaction.default 
# None 
print outaction.default 
# 'smi' 
outaction.default='sdf' 
args=parser.parse_args() 
print args 
# Namespace(foo=None, outformat='sdf') 

add_argument bir Action nesnesi döndüren sen argümanlar belirtilen tüm bilgileri içeren bir Eylem varsayılan değiştirebilir bilerek ederken buna değer olduğunu düşünüyorum. Burada, bu eylemleri outaction ve fooaction değişkenlerinde kaydediyorum (bağlantılar). outaction.default, parse_args'un kullandığı varsayılan değerdir.

Devralınan kodunuzla, outaction bağlantısını kaydetmek için gariptir ('parser._actions' listesinde bulmak mümkün olsa da). Bu yüzden işinizi set_defaults yapalım.

set_defaults için kod öğretici olabilir:

def set_defaults(self, **kwargs): 
    self._defaults.update(kwargs) 

    # if these defaults match any existing arguments, replace 
    # the previous default on the object with the new one 
    for action in self._actions: 
     if action.dest in kwargs: 
      action.default = kwargs[action.dest] 

Önce parser._defaults sözlükte yeni varsayılan koyar ve daha sonra şartlı action.default niteliği (parser._actions aranmasını dikkat edin) değiştirir. Her ikisini de yapmak zorundadır, çünkü varsayılanları kullanmak için zaman geldiğinde, action.default değeri parser._defaults değerine göre önceliğe sahiptir. Bu kodu etkileşimli bir kabukta (ör. Ipython) çalıştırırsanız ve action ve parser nesnelerini yazdırabiliyorsanız, bu bilgiler daha anlamlı olacaktır. 'Özel' özelliklerle oynamakla ilgili genel uyarılar geçerlidir.

İlgili konular