解析数字命令行参数时遇到问题

时间:2016-10-07 20:11:13

标签: python

我正在创建一个超级简单的程序,它从命令行中给出的字符串中删除偶数或奇数。例如:

$ 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()

2 个答案:

答案 0 :(得分:4)

sys.argv[1] == 1是不可能的。你的意思是:sys.argv[1] == "1"。这些是字符串,而不是数字。

你的论证解析需要一些清理。不需要所有这些检查和例外来完成这么简单的任务。

请允许我进行“代码审核”&amp;修复你的代码(我专注于arg解析部分,通过try / except 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()

现在它真的“非常简单”,作为奖励,它有效:)

答案 1 :(得分:1)

与OP和目前为止的另一个答案不同,我不知道为什么你会计算奇数和偶数列表,知道你只需要其中一个 - 它的短距离来自&#34;简单&#34;到&#34;效率低下&#34;。我们如何推迟艰苦的工作&#34;在我们完成&#34;轻松工作之前,简化列表!对参数进行解码:

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()

原始计划的具体问题:oddeven变量已被撤消;命令行参数被视为数字而不是看起来像数字的字符串;命令行参数列表的长度的有效性正在 项目已经从中提取之后进行测试 - 它应该在之前进行测试;由于程序员错误而不是用户错误,可能会出现IndexError异常 - ValueError异常更可能是由于用户错误(输入非数字)。

相关问题