不久前,为了好玩,我用Python实现了一个atoi (从ascii到整型),我想知道我能做些什么来改进它。
class CannotConvertToInteger(Exception):
"""A non-numeric character was present in the string passed to atoi"""
pass
def atoi(string : str) -> int:
sign = multiplier = 1
val = 0
if string[0] == '-':
string = string[1:]
sign = -1
elif string[0] == '+':
string = string[1:]
for i in string[::-1]:
code = ord(i)
try:
if ((code > 57) or (code < 48)):
raise CannotConvertToInteger
else:
val += (code - 48) * multiplier
multiplier *= 10
except CannotConvertToInteger:
return print('Cannot convert string to an integer!')
return (val * sign)
test_string = input('Enter an optionally signed integer: ')
result = atoi(test_string)
if result:
print('It was a valid int! atoi() returned:', result)
else:
print('It was an invalid int! atoi() returned:', result)
input()我要问的一个具体问题是,作为打印错误并同时从函数返回的方法,返回打印调用是否是错误的做法?我这样做是为了能够打印错误并在同一行上返回None。
发布于 2019-09-07 08:04:40
我要问的一个具体问题是,作为打印错误并同时从函数返回的方法,返回打印调用是否是错误的做法?我这样做是为了能够打印错误,并在同一行中返回一个错误。
至少可以说,这是非传统的。通过在内部捕获异常并将其打印到控制台,您将失去在调用代码中处理异常的能力。如果发生错误,而函数本身无法处理该错误,则应引发异常,从而使调用方有可能决定如何处理该错误。另外,问问自己:你选择的方法有什么好处?是
如果结果:print(它是一个有效的int!atoi()返回:‘,test_string),否则:print(’它是一个无效的int!atoi()返回:‘,结果)
实际上比以下情况更好:
try:
result = atoi(test_string)
print('It was a valid int! atoi() returned:', result)
except CannotConvertToInteger:
print('It was an invalid int!)string[::-1]实际上创建了一个副本,因为字符串是不可变的。您可以通过使用reversed(string)来避免这种情况,这对于您的用例来说是非常好的,因为您只想要个位数,而不是全部颠倒。try: ... catch ...:是这里的有利方法。https://codereview.stackexchange.com/questions/227620
复制相似问题