说明:编写一个函数validate_input(string),它接受格式为'command arg1 arg2'的命令字符串并返回该对('command',[arg1,arg2]),其中arg1和arg2已转换为彩车。如果命令不是'add','sub','mul'或'div'之一,则必须引发InvalidCommand。如果参数无法转换为浮点数,则必须引发InvalidCommand。
典型输入和输出:
validate_input('add 2 3') - > ('添加'[2.,3。])
validate_input('hahahaha 2 3') - >引发InvalidCommand()
validate_input('add six 3') - >引发InvalidCommand()
这是我的代码:
class InvalidCommand(Exception):
pass
def validate_input(string):
"""
validate_input(str) -> (str, [float])
If string is a valid command, return its name and arguments.
If string is not a valid command, raise InvalidCommand
Valid commands:
add x y
sub x y
mul x y
div x y
Arguments x and y must be convertable to float.
"""
# your code here
inlist = string.split(' ')
commands = []
strdigits = []
floats = []
output = []
for x in inlist:
if x.isdigit():
strdigits.append(x)
else:
commands.append(x)
for x in commands:
try:
x == 'add' or x == 'sub' or x == 'mul' or x == 'div'
output.append(x)
except ValueError:
raise InvalidCommand(ValueError)
for x in strdigits:
try:
float(x)
floats.append(float(x))
except ValueError:
raise InvalidCommand(ValueError)
output.append(floats)
return tuple(output)
当我在它应该引发InvalidCommand()的值上测试它时,它告诉我“你的代码必须引发InvalidCommand()。但是我的代码确实。我检查了错别字而且没有。所以我整个提升声明是否错误?请告诉我如何解决这个问题。谢谢。
答案 0 :(得分:1)
这一行:
x == 'add' or x == 'sub' or x == 'mul' or x == 'div'
什么都不做。它实际上并没有对您的测试结果做任何事情,当然它不会引发ValueError
。
你需要的是这样的东西:
if x.lower in ('add', 'sub', 'mul', 'div'):
output.append(x)
else:
raise InvalidCommand('unknown command: {}'.format(x))
您的代码适用于数字参数,因为float()
如果给出了一个无法转换为float的字符串,则可以引发ValueError
:
>>> float('abcd')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: abcd
另外,为什么要将ValueError
作为参数传递给自定义异常?您可能希望传递一个描述错误性质的错误字符串,例如
raise(InvalidCommand('arguments must be numeric: {}'.format(x))
或者,您可以窃听ValueError
的消息:
try:
float(x)
floats.append(float(x))
except ValueError as exc:
raise InvalidCommand(exc)
答案 1 :(得分:0)
你使这种方式变得比它需要的更复杂。
class InvalidCommand(Exception):
pass
def validate_input(datastr):
"""
validate_input(str) -> (str, [float])
If string is a valid command, return its name and arguments.
If string is not a valid command, raise InvalidCommand
Valid commands:
add x y
sub x y
mul x y
div x y
Arguments x and y must be convertable to float.
"""
inlist = datastr.split()
if len(inlist) != 3:
raise InvalidCommand('Bad command length: ' + str(len(inlist)))
x = inlist[0]
if x in ('add', 'sub', 'mul', 'div'):
cmd = x
else:
raise InvalidCommand('Bad command verb: ' + x)
floats = []
for x in inlist[1:]:
try:
floats.append(float(x))
except ValueError:
raise InvalidCommand('Bad command arg: ' + x)
return cmd, floats
#Test
data = [
'add 1 2',
'sub 3.0 2.0',
'mul 4.5 1.5',
'div 8 4',
'add 1 2 3',
'fred 2 3',
'add a b',
'sub 1 c',
]
for s in data:
try:
print(validate_input(s))
except InvalidCommand as e:
print(repr(s), e)
<强>输出强>
('add', [1.0, 2.0])
('sub', [3.0, 2.0])
('mul', [4.5, 1.5])
('div', [8.0, 4.0])
'add 1 2 3' Bad command length: 4
'fred 2 3' Bad command verb: fred
'add a b' Bad command arg: a
'sub 1 c' Bad command arg: c
我已经更改了validate_input
函数的参数,因为string
是标准Python模块的名称,因此将它用于简单的变量名称会让人感到困惑。如果你想使用那个模块,那么像这样遮蔽它的名字可能会导致恼人的错误。
答案 2 :(得分:0)
我为我的单科csse1001做了同样的问题。我做的是这个:
# your code here
lst = string.split(' ')
commands = ['add', 'sub', 'mul', 'div']
if lst[0] not in commands:
raise InvalidCommand()
if len(lst) != 3:
raise InvalidCommand()
try:
arg1 = float(lst[1])
arg2 = float(lst[2])
return(lst[0], [arg1, arg2])
except ValueError:
raise InvalidCommand()
这对我有用。