首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atoi的Python实现

atoi的Python实现
EN

Code Review用户
提问于 2019-09-07 06:22:54
回答 1查看 2K关注 0票数 7

不久前,为了好玩,我用Python实现了一个atoi (从ascii到整型),我想知道我能做些什么来改进它。

代码语言:javascript
复制
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

EN

回答 1

Code Review用户

发布于 2019-09-07 08:04:40

错误处理

我要问的一个具体问题是,作为打印错误并同时从函数返回的方法,返回打印调用是否是错误的做法?我这样做是为了能够打印错误,并在同一行中返回一个错误。

至少可以说,这是非传统的。通过在内部捕获异常并将其打印到控制台,您将失去在调用代码中处理异常的能力。如果发生错误,而函数本身无法处理该错误,则应引发异常,从而使调用方有可能决定如何处理该错误。另外,问问自己:你选择的方法有什么好处?是

如果结果:print(它是一个有效的int!atoi()返回:‘,test_string),否则:print(’它是一个无效的int!atoi()返回:‘,结果)

实际上比以下情况更好:

代码语言:javascript
复制
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)来避免这种情况,这对于您的用例来说是非常好的,因为您只想要个位数,而不是全部颠倒。
  • 这个复杂的结构尝试: if ((代码> 57)或(代码< 48)):CannotConvertToInteger or : val += (代码- 48) *乘法器*= 10 (CannotConvertToInteger除外):返回打印(‘不能将字符串转换为整数!’)是您选择处理错误案例的方式所付出的代价。如前所述,删除try: ... catch ...:是这里的有利方法。
  • @Graipher的S 回答在使用内置的例外和避免神奇的数字方面有更多的优点,在写这篇文章时,我几乎立刻想到了,但在写的过程中却忘记了。
  • 顺便提一句:您不需要在Python的条件下使用parens。大多数人只有在条件变得非常长并且需要跨越多条线的情况下才会使用它们。返回值也是如此。在这里,父母就更没有必要了。
  • 您应该看看正式的Python代码样式指南 (通常称为PEP8)。与代码最相关的建议是,每个缩进级别使用4个空格,并避免在每个源行进行多次初始化。代码评审的元站点也有一个不错的工具清单,它可以帮助您自动检查。
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/227620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档