проверка, был ли передан аргумент arg, когда по умолчанию установлено значение python optparse - PullRequest
0 голосов
/ 17 мая 2018

Я хочу проверить, действительно ли аргумент был передан в командной строке, когда для этого аргумента есть значение по умолчанию.

Конкретно в моем случае я использую SCons, а scons имеет класс, который наследуется от optparse питонов. Итак, мой код такой:

from SCons.Environment import Environment
from SCons.Script.SConsOptions import Parser

MAIN_ENV = Environment() 
argparser = Parser(MAIN_ENV._get_major_minor_revision(SCons.__version__))
print(argparser.parse_args())

Который печатает все аргументы со значениями, но я не могу сказать, был ли установлен один из аргументов или просто установлено значение по умолчанию. В этом случае я смотрю на SCons параметр 'num_jobs', который по умолчанию равен 1. Я хотел бы проверить, предоставил ли пользователь значение num_jobs, и использовать его, если это так, или просто установить num_jobs в число процессоров, сообщаемых система.

Я могу использовать sys.argv следующим образом, но я бы предпочел более чистый вариант, используя парсер параметров:

###################################################
# Determine number of Jobs
# start by assuming num_jobs was not set
NUM_JOBS_SET = False
if GetOption("num_jobs") == 1:
    # if num_jobs is the default we need to check sys.argv
    # to see if the user happened to set the default
    for arg in sys.argv:
        if arg.startswith("-j") or arg.startswith("--jobs"):
            if arg == "-j" or arg == "--jobs":
                if(int(sys.argv[sys.argv.index(arg)+1]) == 1):
                    NUM_JOBS_SET = True
            else:
                if arg.startswith("-j"):
                    if(int(arg[2:]) == 1):
                        NUM_JOBS_SET = True
else:
    # user must have set something if it wasn't default
    NUM_JOBS_SET = True

# num_jobs wasn't specificed so let use the
# max number since the user doesn't seem to care
if not NUM_JOBS_SET:
    NUM_CPUS = get_num_cpus()
    print("Building with " + str(NUM_CPUS) + " parallel jobs")
    MAIN_ENV.SetOption("num_jobs", NUM_CPUS)
else:
    # user wants a certain number of jobs so do that
    print("Building with " + str(GetOption('num_jobs')) + " parallel jobs")

Я пытался использовать pythons OptionParser, но если я вызываю parse_args () из OptionParser из python внутри скрипта scons, парсер SCons, похоже, не работает, он не может распознать действительные опции.

Если у кого-то есть пример того, как проверить, был ли передан аргумент arg только с помощью optparse для pythons, этого должно быть достаточно для работы с парсером опции scons.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Из этого вопроса, связанного в комментарии: Как узнать, была ли опция optparse передана в командной строке или по умолчанию

Мне удалось использовать это для моего случая в SCons:

from SCons.Environment import Environment
from SCons.Script.SConsOptions import Parser

###################################################
# Determine number of Jobs
# start by assuming num_jobs was not set
opts_no_defaults = optparse.Values()
parser = Parser(MAIN_ENV._get_major_minor_revision(SCons.__version__))
__, args = parser.parse_args(values=opts_no_defaults)
opts = optparse.Values(parser.get_default_values().__dict__)
opts._update_careful(opts_no_defaults.__dict__)

# num_jobs wasn't specificed so let use the
# max number since the user doesn't seem to care
if not hasattr(opts_no_defaults, parser.get_option('--jobs').dest):
    NUM_CPUS = get_num_cpus()
    ColorPrinter().InfoPrint("Building with " + str(NUM_CPUS) + " parallel jobs")
    MAIN_ENV.SetOption("num_jobs", NUM_CPUS)
else:
    # user wants a certain number of jobs so do that
    ColorPrinter().InfoPrint(
        "Building with " + str(GetOption('num_jobs')) + " parallel jobs")
0 голосов
/ 17 мая 2018

Я не уверен, что это решит вашу проблему или нет, но вы можете написать декоратор, а в декораторе вы можете найти переданный или нет параметр.

Я приведу базовый пример.

def deco(fun):
    def wraper(*args, **kwargs):
        if 'name' in kwargs:
            print('Will use default parameter');
        return fun(*args, **kwargs)

    return wraper

@deco
def greet(name = 'World'):
    print('Hello '+name)

greet(name = 'Praveen')
greet()
...