Argparse isteğe bağlı bağımsız değişkeninin ayarlanıp ayarlanmadığını kontrol edin


112

Kullanıcı tarafından isteğe bağlı bir argparse bağımsız değişkeninin ayarlanıp ayarlanmadığını kontrol etmek istiyorum.

İsset kullanarak güvenle kontrol edebilir miyim?

Bunun gibi bir şey:

if(isset(args.myArg)):
    #do something
else:
    #do something else

Bu, float / int / string türü argümanlar için aynı şekilde mi çalışır?

Varsayılan bir parametre ayarlayabilir ve kontrol edebilirim (örneğin, myArg = -1 veya bir dizge için "" veya "NOT_SET"). Ancak, nihayetinde kullanmak istediğim değer yalnızca komut dosyasında daha sonra hesaplanır. Bu yüzden varsayılan olarak -1 olarak ayarlayıp daha sonra başka bir şeye güncellerdim. Bu, değerin kullanıcı tarafından ayarlanıp ayarlanmadığını kontrol etmeye kıyasla biraz beceriksiz görünüyor.


1
Ne olurdu isset()(ipucu: Python PHP değil)? hasattr()Bunun yerine belki mi demek istedin ? Neden bunun yerine argparse'ı bir seçenek için varsayılan ayarlayacak şekilde yapılandırmıyorsunuz?
Martijn Pieters

@MartijnPieters - evet, doğru. Öyleyse basitçe kontrol edebilir miyim (args.myArg): ...
Madeleine

Yanıtlar:


146

Bence isteğe bağlı argümanlar (ile belirtilir --), Noneeğer sağlanmadıkları takdirde başlatılır . Böylece test edebilirsiniz is not None. Aşağıdaki örneği deneyin:

import argparse as ap

def main():
    parser = ap.ArgumentParser(description="My Script")
    parser.add_argument("--myArg")
    args, leftovers = parser.parse_known_args()

    if args.myArg is not None:
        print "myArg has been set (value is %s)" % args.myArg

"Yoktur" ve "Yoktur" testleri tam olarak istediğim ve beklediğim gibi çalışır. Teşekkürler.
Madeleine P. Vincent

39
Ne yazık ki işe yaramıyor sonra argüman defaultdeğerini tanımladı.
kcpr

6
Bir ayarlamak defaultistiyorsanız, yine de belgelerde açıklandığı gibi nargs='?'bir constdeğer ayarlayabilir ve sağlayabilirsiniz . Arg yok olduğunda, argüman w / o değeri verildiğinde kullanılır, aksi takdirde verilen değer kullanılır. Sadece ve ile , verilmemişse, değer verilmemişse, aksi takdirde verilen değer kullanılır. defaultconstdefaultnargs='?'defaultNone
Ioannis Filippidis

@IoannisFilippidis kullanırsanız action= "store_true"veya action="store_const", const="yourconst"bu argümanı başka bir değeri saklamak için kullanamazsanız. Varsayılanları kullanırken bu çalışmayacaktır. Kendi başıma, argparser'daki tüm varsayılanları kaldırdım ve hepsini ConfigParser def defaults():, ArgumentParser ve varsayılan değerleri istediğim sırada karıştırdığım başka bir işlevde ele
aldım

@ erm3nda Bir action. Cevap bir action. Bahsettiğiniz eylemlerin belirli bir şekilde davrandığı belgelenmiştir (gözlemlediğiniz gibi). Yine de bir eylemi tanımlamak gerekli değildir.
Ioannis Filippidis

37

@Honza'nın belirttiği gibi is Noneiyi bir test. Bu varsayılandır defaultve kullanıcı size onu kopyalayan bir dize veremez.

Başka bir tane belirleyebilir default='mydefaultvalueve bunun için test edebilirsiniz . Peki ya kullanıcı bu dizeyi belirtirse? Bu ayar olarak sayılır mı, sayılmaz mı?

Ayrıca belirtebilirsiniz default=argparse.SUPPRESS. Daha sonra kullanıcı bağımsız değişkeni kullanmazsa, argsad alanında görünmez . Ancak bunu test etmek daha karmaşık olabilir:

args.foo # raises an AttributeError
hasattr(args, 'foo')  # returns False
getattr(args, 'foo', 'other') # returns 'other'

Dahili parserolarak seen_actions, 'gerekli' ve 'karşılıklı olarak_ özel' testlerin bir listesini tutar ve bunu kullanır. Ama sizin dışınızda sizin için mevcut değil parse_args.


22

Bu seçeneği kullanmanın default=argparse.SUPPRESSen mantıklı olduğunu düşünüyorum . Ardından, bağımsız değişkenin olup olmadığını kontrol etmek yerine, bağımsız not Nonedeğişkenin insonuçta ortaya çıkan ad alanı olup olmadığını kontrol eder .

Misal:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--foo", default=argparse.SUPPRESS)
ns = parser.parse_args()

print("Parsed arguments: {}".format(ns))
print("foo in namespace?: {}".format("foo" in ns))

Kullanımı:

$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
Bağımsız değişken sağlanmadı:
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False

Bu benim için Python 3.7.5 (Anaconda) altında çalışmıyor. testfoo.py: error: argument --foo: expected one argument
Mike Wise

Kullanmak isterseniz @MikeWise --foobir değere (yani olmadan 1bizim örneğimizde), belirttiğiniz zorunda nargs=0içinde add_argumentişlevi.
Erasmus Cedernaes

Kodunuzu yanıtta belirtildiği gibi kopyalayıp yapıştırdım. Belki de düzenlemelisin? action='store_true'Gerçek kodumda bunun yerine aşağıdaki cevabı kullandım .
Mike Wise

@MikeWise betiği olarak python argparse_test.py --foo 1mı çalıştırdınız ?
Erasmus Cedernaes

11

İsteğe bağlı olarak iletilen bir bayrağı store_trueve store_falsebağımsız değişken eylem seçenekleriyle kontrol edebilirsiniz :

import argparse

argparser = argparse.ArgumentParser()
argparser.add_argument('-flag', dest='flag_exists', action='store_true')

print argparser.parse_args([])
# Namespace(flag_exists=False)
print argparser.parse_args(['-flag'])
# Namespace(flag_exists=True)

Bu şekilde, koşullu kontrol etme konusunda endişelenmenize gerek kalmaz is not None. Sadece Trueveya kontrol edin False. Buradaki belgelerde bu seçenekler hakkında daha fazla bilgi edinin


1
bu, değeri olan bir argümanın ayarlanıp ayarlanmadığını bilmek için çözülmez. buradaki ana sorun, args değerinin defaul = "" dan mı yoksa kullanıcı tarafından mı sağlandığını bilmektir.
m3nda

5

Argümanınız konumsal ise (yani bir "-" veya "-" öneki yoksa, sadece argüman, tipik olarak bir dosya adı) , bunu yapmak için nargs parametresini kullanabilirsiniz:

parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()

if args.filename is not None:
    print('The file name is {}'.format(args.filename))
else:
    print('Oh well ; No args, no problems')

3

Argparse değişkeni kullanıp kullanmadığımı görmek için benim çözümüm

import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-1", "--first", required=True)
ap.add_argument("-2", "--second", required=True)
ap.add_argument("-3", "--third", required=False) 
# Combine all arguments into a list called args
args = vars(ap.parse_args())
if args["third"] is not None:
# do something

Bu, kullandığım ve programım için çalışmak üzere uyarladığım yukarıdaki cevaba daha fazla fikir verebilir.


0

@ Kcpr'nin @ Honza Osobne tarafından (şu anda kabul edilen) yanıta ilişkin yorumunu ele almak için

Maalesef işe yaramıyor sonra bağımsız değişken, varsayılan değerini tanımladı.

önce argümanın, seçeneği Namespacesağlayan abd nesnesiyle karşılaştırılarak default=argparse.SUPPRESS(@ hpaulj's ve @Erasmus Cedernaes yanıtlarına ve bu python3 belgesine bakın) sağlanıp sağlanmadığı kontrol edilebilir ve sağlanmadıysa, daha sonra varsayılan bir değere ayarlanabilir.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--infile', default=argparse.SUPPRESS)
args = parser.parse_args()
if 'infile' in args: 
    # the argument is in the namespace, it's been provided by the user
    # set it to what has been provided
    theinfile = args.infile
    print('argument \'--infile\' was given, set to {}'.format(theinfile))
else:
    # the argument isn't in the namespace
    # set it to a default value
    theinfile = 'your_default.txt'
    print('argument \'--infile\' was not given, set to default {}'.format(theinfile))

kullanım

$ python3 testargparse_so.py
argument '--infile' was not given, set to default your_default.txt

$ python3 testargparse_so.py --infile user_file.txt
argument '--infile' was given, set to user_file.txt

0

Çok basit, args değişkenini 'args = parser.parse_args ()' ile tanımladıktan sonra, args alt küme değişkenlerinin tüm verilerini de içerir. Bir değişkenin ayarlanıp ayarlanmadığını kontrol etmek için 'action = "store_true" kullanıldığını varsayarsak ...

if args.argument_name:
   # do something
else:
   # do something else
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.