2013-09-25 2 views
0

У меня есть эти заявления:Python: конденсационные множественным, если условия

for arg in sys.argv[1:]: 
    if not "-a" in arg and not "-i" in arg and not "-r" in arg and not "-o" in arg and not "-s" in arg: 
     print "Error: invalid argument \"" + arg + "\"." 

Там должен быть способ уплотнить эти утверждения, чтобы в конечном итоге с меньшим количеством кода. Может кто-нибудь мне помочь?

+4

Попробуйте использовать питонов [argparse] (HTTP: // документы .python.org/dev/library/argparse.html). Это облегчит вашу жизнь (избегает этого беспорядка), и ваши программы выглядят более профессионально. – Serdalis

+0

Можете ли вы сказать словами, что вы пытаетесь проверить? Я думаю, это может помочь прояснить, как переписать эту логику. – tacaswell

+0

Это действительно странный способ реализации обработки аргументов. например, что делать, если вы хотите сделать что-то вроде 'python script.py -f filename -o hypermode -l item1 item2 item3' и т. д. и т. д. Ваш текущий формат кода не будет работать для такого типа вещей. – Shashank

ответ

3

Попробуйте это:

valid = {"-a", "-i", "-r", "-o", "-s"} # using a set, for efficiency 
for arg in sys.argv[1:]:     # loop over args 
    if not any(v in arg for v in valid): # equivalent to code in question 
     print 'Error: invalid argument "{}".'.format(arg) # using format string 

Но на самом деле, вы должны рассмотреть возможность использования специализированного парсер для аргументов командной строки (например, argparse): это не достаточно прочным, и даст вам «ложных срабатываний» и «ложные негативы »- см. комментарии.

+0

Это работает только в том случае, если все аргументы соответствуют '' - [az] «pattern», и если вы собираетесь это сделать, вы также можете снять черту. 'if arg.lstrip ('-') не в 'airos': ...'. В противном случае, если 'arg' что-то вроде' --awful', вы получите ложный отрицательный результат. – kojiro

+1

@kojiro OP просто проверяет, находится ли какой-либо из командных переключателей в переменной 'arg'. Конечно, это не очень надежно, так как вышеприведенное будет принимать как '' -a "и' "-angry" 'как действительные, но семантически эквивалентно коду в вопросе. Чтобы создать действительно сильный синтаксический анализатор, необходимо использовать 'argparse' –

+1

@kojiro. Да, это дает« ложные негативы »в качестве синтаксического анализа команд. Но опять же, я не собираюсь строить такого зверя, я пишу только более короткую версию кода OP, но код OP недостаточно прочен, чтобы начать с –

1

Вы можете уплотнить их, выполнив:

if arg not in "-a-i-r-o-s": 
    print "Error: invalid argument \"{}\".".format(arg) 

Но я бы рекомендовал использовать в argparse модуль, чтобы сделать все это для вас.

0

Вы действительно хотите, чтобы проверить, является ли (например) -a является в аргумент, или -aявляется аргумент? Последний был бы более распространенным явлением. Вы могли бы сделать что-то вроде этого:

if arg.startswith("-") and arg[1:2] not in "airos": 
    print "Error: invalid argument '%s'" % arg[:2] 

Если вы действительно хотите, чтобы проверить, является ли -a в аргументе, самый простой способ, вероятно:

if not any("-" + c in arg for c in "airos"): 
    print "Error: invalid argument '%s'" % arg 
+0

Я хочу проверить, является ли '-a' _in_ аргументом. – user1676037

+0

@ user1676037 Должно ли '-a' быть в первых двух символах строки аргумента? Если это так, то решение очень просто. :) – Shashank

Смежные вопросы