2016-10-07 4 views
-2

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

$ test.py 1 1234 
13 
$ test.py 2 1234 
24 

Проблема в том, что я не могу заставить ее работать. Он печатает использование вместо ожидаемых чисел.

$ test.py 1 1234 
Usage: test.py [option] [number], etc.. 

Кроме того, это должно напечатать использование, но вместо этого ничего не делает:

$ python2.7 test.py 1 
$ 

Почему не программа вывода использование? len(sys.argv) - < 2, поэтому он должен использовать печать, правильно?

def oddtarray(num): 
    tlist = map(int, str(num)) 
    tnum = [x for x in tlist if (x % 2) != 0] 
    return tnum 
def eventarray(num): 
    tlist = map(int, str(num)) 
    tnum = [x for x in tlist if (x % 2) == 0] 
    return tnum 
def transform(): 
    try: 
     odd = int(''.join(map(str, eventarray(sys.argv[2])))) 
     even = int(''.join(map(str, oddtarray(sys.argv[2])))) 
      if len(sys.argv) == 3: 
       if sys.argv[1] == 1: 
        print odd 
       elif sys.argv[1] == 2: 
        print even 
       else: 
        usage() 
      else: 
       usage() 
    except IndexError: 
     if len(sys.argv) < 2: 
      usage() 
def usage(): 
    print 'Usage: test.py [option] [number]' 
    print 'Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers' 

transform() 
+0

Попробуйте просто «python» без 2.7? – ApproachingDarknessFish

+0

'transform' имеет ошибку с отступом. Является ли предложение 'else', которое работает' use' безоговорочно в паре с 'try' вместо' '' '' '' 'выражения? – chepner

+0

Да Вы правы. Извините первый раз, много ошибок – Joshua

ответ

1

В отличие от OP и еще одного ответа, я не понимаю, почему вы будете вычислять как нечетные, так и даже списки, Мне нужен только один из них - это небольшое расстояние от «простого» до «просто неэффективного». Как насчет мы задерживаем «тяжелую работу» прореживание списков, пока мы не закончили «легкую работу» декодирований аргументов:

import sys 

def oddtarray(digits): 
    tlist = map(int, digits) 
    tnum = [x for x in tlist if (x % 2) != 0] 
    return int(''.join(map(str, tnum))) 

def eventarray(digits): 
    tlist = map(int, digits) 
    tnum = [x for x in tlist if (x % 2) == 0] 
    return int(''.join(map(str, tnum))) 

def transform(): 
    if len(sys.argv) == 3: 

     try: 
      if sys.argv[1] == "1": 
       print oddtarray(sys.argv[2]) 
      elif sys.argv[1] == "2": 
       print eventarray(sys.argv[2]) 
      else: 
       usage() 
     except ValueError: 
      usage() 
    else: 
     usage() 

def usage(): 
    print 'Usage: test.py [option] [number]' 
    print 'Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers' 

transform() 

Конкретных проблемы с оригинальной программой: в odd и even переменных поменялись местами; аргументы командной строки обрабатываются как числа, а не как строки, которые выглядят как числа; проверяется достоверность длины списка аргументов командной строки после того, как элементов уже извлечены из нее - она ​​должна быть проверена ранее; вероятность исключения IndexError более вероятна из-за ошибки программиста, чем ошибка пользователя. Исключение ValueError более вероятно из-за ошибки пользователя (ввода цифр).

+0

Это приятное дополнение к ответу @ JeanFrancoisFabre, но он не отвечает на вопрос сам.Я рекомендую обратиться к проблеме (-ям) в вопросе напрямую, чтобы ваш ответ стоял один. –

+0

Этот ответ отличный! Каждая проблема исправлена, и она намного эффективнее. Спасибо, сэр. По какой-то причине этот фрагмент кода фактически фиксирует проблемы с выпуском, хотя я действительно не знаю, почему – Joshua

+0

хорошее замечание. Так много ошибок мы упустили из этой части, даже если это на самом деле не отвечает на вопрос. Вы также можете предложить создать общую нечетную/event-процедуру, просто изменив == by! =, Отбросьте «список (цифры)», потому что «цифры» уже являются взаимозависимыми ... список потенциальных улучшений здесь большой. Было бы хорошо для обзора кода сейчас :) –

4

sys.argv[1] == 1 невозможно. Вы видите: sys.argv[1] == "1". Это строки, а не числа.

Для анализа ваших аргументов потребуется некоторая очистка. Не нужно для всех этих проверок и исключений выполнять такую ​​простую задачу.

Позвольте мне «просмотр кода» & исправить код (я сосредоточился на агд разборе части, защищая целочисленное синтаксический на попытки/за исключением ValueError использования печати и проверки количества аргументов):

import sys 
def oddtarray(num): 
    tlist = map(int, str(num)) 
    tnum = [x for x in tlist if (x % 2) != 0] 
    return tnum 
def eventarray(num): 
    tlist = map(int, str(num)) 
    tnum = [x for x in tlist if (x % 2) == 0] 
    return tnum 

def transform(): 
    if len(sys.argv) < 3: 
     # not enough arguments: print usage and that's it! 
     usage() 
    else: 
     try: 
      command = int(sys.argv[1]) # convert to integer 
      odd = int(''.join(map(str, eventarray(sys.argv[2])))) 
      even = int(''.join(map(str, oddtarray(sys.argv[2])))) 

      if command == 1: 
       print(odd) 
      elif command == 2: 
       print(even) 
      else: 
       usage() 
     except ValueError as e: 
      # some string to integer went wrong: display detailed exception 
      # just in case, then usage 
      print(str(e)) 
      usage() 
def usage(): 
    print('Usage: test.py [option] [number]') 
    print('Options: \n[1] - Remove even numbers\n[2] - Remove odd numbers') 

transform() 

теперь это действительно «супер просто», и в качестве бонуса он работает :)

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