Python'da 'argparse.ArgumentError' kullanımı

Python'da argparse modülünde ArgumentError istisnasını kullanmak isterdim, ancak nasıl kullanılacağını çözemiyorum. İmza, ArgumentError (argüman, mesaj) olarak adlandırılması gerektiğini söylüyor, ancak ne argümanının olması gerektiğini çözemiyorum. Ayrıştırıcı nesnesinin bir parçası olması gerektiğini düşünüyorum, ancak bunun için herhangi bir belge bulamadım.

35
Mevcut sınıfların yaptığı gibi, bunu özel bir Eylemi sınıfında kullanabilirsiniz. Ancak bunu ayrıştırıcı dışında yapmak için bir neden düşünemiyorum. Özel bir şey yapmaz - yalnızca Eylem adını hata mesajına ekler. Kodda kullanımını inceleyin.
katma yazar hpaulj, kaynak
katma yazar DavidRR, kaynak

2 cevap

kaynak dokümantasyondan :

ArgumentError: Ayrıştırıcı işlemleriyle ilgili hata olduğunda ArgumentParser nesneleri tarafından oluşturulan istisna. Komut satırını ayrıştırırken ortaya çıkan hatalar ArgumentParser tarafından yakalanır ve komut satırı mesajları olarak yayılır.

Yapıcının argümanı parametresi, istisnanın ortaya çıktığı Action nesnesidir. Genellikle onu bir Action alt sınıfının dışına yükseltmeye gerek yoktur ve alt sınıfları kaldırırken açıkça yükseltmeye gerek yoktur; bunun yerine genellikle ValueError (veya uygun olanı) yükseltirsiniz.

Float değerleri 0 ile 1 arasında

Yorumunuzla ilgili olarak, yalnızca 0 ile 1 arasındaki kayan nokta değerlerini kabul etmek istiyorsunuz. Bunun için özel tür tanımlamak için bu yeteneği kullanmalısınız. Bunu, örneğin şöyle yapabilirsiniz:

def percentFloat (string):
    value = float(string)
    if value < 0 or value > 1:
        raise argparse.ArgumentTypeError('Value has to be between 0 and 1')
    return value

parser = argparse.ArgumentParser()
parser.add_argument('test', type=percentFloat)
parser.parse_args()

Bunun, aynı zamanda float (string) argparse tarafından geçersiz bir tür hatası da tetikleyen float olmayanlar için ValueError oluşturacağından float olmayanlara karşı da güvenli olduğunu unutmayın. modül. ArgumentTypeError yalnızca belirtmenin bir yoludur özel bir hata mesajı.

Karşılıklı özel parametreler

For Karşılıklı özel parametreler, you should use argparse.add_mutually_exclusive_group.

Parametre bağımlılığı

Parametre bağımlılığı isn’t really something that should be done by the argument parser. For semantic details, you should instead simply do it yourself:

args = parser.parse_args()
if args.w and not args.p:
    parser.error('-p is required when -w is set.')

Özelleştirmek için ArgumentParser.error 'ı kullanabilirsiniz. programı kesecek ve konsola yazdıracak hata mesajı.

Fakat elbette böyle basit bir durumda, eğer mümkünse -p 'yi dolaylı olarak tahmin etmek çok daha anlamlı olacaktır.

49
katma
Bu doğru değil. Sadece değeri gönderirsem, AttributeError: 'float' nesnesinin 'option_strings' özniteliği yoktur.
katma yazar asmeurer, kaynak
Bu arada, kullanmak istiyorum çünkü modülün doğrudan desteklemediğini kontrol etmek istiyorum. Örneğin, 0 ile 1 arasında bir kayan nokta değeri istiyorum. Argparse bunun bir kayan nokta olduğunu belirtmenizi sağlar, ancak aralığı el ile kontrol etmem gerekir. Bu değer yanlış olduğunda ortaya çıkacak doğru hata gibi görünüyor.
katma yazar asmeurer, kaynak
Olumsuz, cevap yanlış olduğu için. ArgumentError (1.1, "Aralık dışı değer"), yukarıda bahsettiğim gibi AttributeError'ı yükseltir. Bunun bir çeşit içsel bağımsızlık nesnesi olması gerekiyor, ama ne olduğunu çözemiyorum. Bu arada, bunu ne zaman yapmak istediğinize dair bir başka örnek, söyleyebileceğim kadarıyla argparse modülünün doğrudan desteklemediği argümanlara önemsiz olmayan bir bağımlılık tanımlamak istediğiniz zamandır. -w seçeneği gibi bir şey için -p seçeneği gerekir veya -n ve -N birbirini dışlar.
katma yazar asmeurer, kaynak
Teşekkürler. Bu çözümleyici, aradığım şeydi.
katma yazar asmeurer, kaynak
@asmeurer Size nasıl yapılacağına dair bir örnek vermek için cevabımı düzenledi
katma yazar poke, kaynak
Cevabım güncellendi.
katma yazar poke, kaynak

parser.error() çoğu insanın muhtemelen istediği şey olsa da, argparse.ArgumentError() (soru sorulduğunda) kullanabilirsiniz. > aşağıdaki örnekte bar_arg :

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
bar_arg = parser.add_argument('--bar')

args = parser.parse_args()
if args.bar == 'xyzzy':
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")

if args.foo == 'xyzzy':
    parser.error("Can't be 'xyzzy'")

Bu, aşağıdaki gibi çıktıya yol açacaktır:

$ python argparse_test.py --foo xyzzy
usage: argparse_test.py [-h] [--foo FOO] [--bar BAR]
argparse_test.py: error: Can't be 'xyzzy'

$ python argparse_test.py --bar xyzzy
Traceback (most recent call last):
  File "argparse_test.py", line 10, in 
    raise argparse.ArgumentError(bar_arg, "Can't be 'xyzzy'")
argparse.ArgumentError: argument --bar: Can't be 'xyzzy'
11
katma
Bu, ayrıştırıcı dışında ArgumentError 'ın kullanılmasının mümkün olduğu, ancak muhtemelen parser.error ' in kullanılmasından daha düşük bir örnek.
katma yazar hpaulj, kaynak
Hata mesajınızı iyi yazarsanız, hangi anahtarın rahatsız edici olduğu konusunda bahsettiğinizden emin olun. Her eklenen bağımsız değişken için ayrı bir değişken oluşturmak çok hantal olabilir ...
katma yazar Praveen, kaynak
@hpaulj, evet, ancak ArgumentError'un bir faydası var: hangi anahtarın rahatsız edici olduğunu bilmenizi sağlar.
katma yazar ukrutt, kaynak
@Praveen Sanırım tercih meselesi. Ben kendim değişkeni "'--foo' 'xyzzy'" olarak yazmamayı tercih ediyorum, çünkü daha sonra anahtarın uygun adının ne olduğunu hatırlamak zorundayım (mutlaka args özniteliği ile aynı değil ). Ancak dürüst olmak gerekirse, parser.error() 'nin varsayılan olarak rahatsız edici anahtarın adını içermesi gerektiğini düşünüyorum.
katma yazar ukrutt, kaynak