Отрицательные логические параметры - нет-что-либо в optparse? - PullRequest
8 голосов
/ 30 марта 2012

При optparse существует ли простой способ определения отрицательных опций, например, --no-cleanup?

Я сделал это таким образом, но это громоздко и подвержено ошибкам, особенно из-за проверки None, которую легко забыть и опустить:

#!/bin/env python

from __future__ import print_function
import sys
import optparse

def main(argv):
    parser = optparse.OptionParser("usage: %prog [options]")
    parser.add_option("--no-cleanup",
                      dest = "cleanup",
                      action = "store_false",
                      help = "do cleanup at end?")

    (opts, args) = parser.parse_args()

    if opts.cleanup == None:
        opts.cleanup = True

    # do stuff ...

    if opts.cleanup:
        print("Cleaning up!", file = sys.stderr)
    else:
        print("Not cleaning up", file = sys.stderr)

if __name__ == "__main__":
    main(sys.argv[1:])

В идеале я хотел бы сделать что-то вроде Getoptions::Long в Perl, где я могу определить опцию cleanup как логическое значение, а затем оно автоматически предоставит --cleanup и --no-cleanup и соответственно установить мою логическую переменную.

1 Ответ

4 голосов
/ 30 марта 2012

Если бы я делал это, используя optparse (или в этом случае argparse - при условии, что вы хотите добавить флаг --cleanup и --no-cleanup в одну команду), я бы просто создал подкласс класса синтаксического анализатора опций.Что-то вроде:

from optparse import OptionParser
class MyOptParse(OptionParser):
      def boolean(self,dest,**kwargs):
          self.add_option('--%s'%dest,dest=dest,action='store_true',**kwargs)
          self.add_option('--no-%s'%dest,dest=dest,action='store_false',**kwargs)

Конечно, это полный взлом, но я думаю, что совершенно очевидно, куда я иду с этим ... Вы можете заставить булево поведение вести себя так, как хотите (переформатированиесправка, принимая значение по умолчанию, чтобы в качестве значения по умолчанию было указано «--blah» или «--no-blah» и т. д.)

Я думаю, что

parser=MyOptParse()
parser.boolean('cleanup',default=True,help="Do/Do Not do cleanup")

должен работать и избавиться от строки if options.cleanup is None, пока она включена, поскольку установлено значение по умолчанию, хотя сообщение справки будет повторяться (с предоставленным мною кодом)

Если вы просто хотите добавить значения по умолчанию дляопределенный флаг (чтобы избавиться от проверки для None), вы можете использовать ключевое слово по умолчанию для add_option, OR, согласно документации optparse ...

Более понятный способ указать значение по умолчаниюзначения set_defaults () метод операцииionParser, который вы можете вызвать в любое время перед вызовом parse_args () : например, parser.set_defaults(verbose=True)

...