【问题标题】:Beginner Python: "try/except Error" not printing properly初学者 Python:“try/except 错误”打印不正确
【发布时间】:2017-09-12 18:25:39
【问题描述】:

下面是我的代码。目标是将日期输入转换为虚线格式(例如 01-01-2001)。转换日期后,它应该打印日期。但是,如果日期难以理解或不是有效输入,则应打印“Not a valid date”并返回 None。现在,即使是正确的日期输入,它也只返回 None。转换脚本在之前的任务中使用过并且工作正常,所以我相信问题出在“try/except”块中。

测试输入:

print(date_conversion_robust('19/8/16'))---> 19-08-2016

print(date_conversion_robust('1/12/1898'))---> 01-12-1898

print(date_conversion_robust('16/3/18'))---> 16-03-1918

print(date_conversion_robust('29/2/2017'))---> Not a valid date. None

print(date_conversion_robust('131/2/1928'))---> Not a valid date. None

print(date_conversion_robust(2))---> Not a valid date. None

谢谢!

#Convert date inputs
def convert_day(day_string):
    if int(day_string) < 10:
        return (day_string).zfill(2)
    else:
        return day_string

def convert_month(month_string):
    if int(month_string) < 10:
        return (month_string).zfill(2)
    else:
        return month_string

def convert_year(year_string):
    if int(year_string) < 18:
        return('20'+(year_string))
    elif int(year_string) < 99:
        if int(year_string) >= 18:
            return('19'+(year_string))
    else:
        return year_string


#form date string 
def date_conversion(date_string):
    date_as_list = date_string.split('/')
    a = convert_day(date_as_list[0])
    b = convert_month(date_as_list[1])
    c = convert_year(date_as_list[2])
    try:
        L = [a, b, c]
        return('-'.join(L))
    except(AttributeError, SyntaxError, TypeError):
        print('Not a valid date.')
        return None

【问题讨论】:

  • 你为什么要排除SyntaxErrors?
  • excepts 仅在相应的 try 块内捕获错误-在您的情况下,这只有两个语句,除非在非常人为的情况下,否则它们都不会失败。如果您的代码确实出现任何问题,则很可能是在调用 convert_X 函数之一的过程中,这些函数不受保护。
  • 找出异常是什么以及正在做什么的最好方法是raise,而不是像现在这样处理/捕获它。将print('Not a valid date.') 替换为raise,您将了解更多关于正在发生的事情
  • 请查看How to Ask 并向我们展示您使用的输入以及您获得/期望的输出。您的程序seems to run fine 输入有效。并且要明确:try/except 无法捕获 SyntaxErrors
  • SyntaxError 不是运行时异常,您无法捕获它!...

标签: python


【解决方案1】:

您正在采取一些额外的步骤,并且您正在跳过一些步骤。验证日期和/或处理不同的日期格式是棘手的部分,而您没有这样做:分隔符是 /-. 吗?它是 dd-mm-yyyy 还是 mm-dd-yyyy 或无数其他格式之一? (如果您从具有已知格式的源中提取可能不是问题,但如果您期望人工日期输入肯定会是一个问题)。您的组件转换函数不必有条件地调用.zfill(),即'12'.zfill(2) 不是错误——这意味着您根本不需要函数。您的 try/except 似乎放错了位置:它确实应该围绕验证输入,一旦您拥有三个元素,就不会失败加入它们以创建返回。您可以轻松地使用字符串格式。以此类推。

如上所述使用模块进行日期操作似乎是可行的方法!

【讨论】:

    【解决方案2】:

    Python 的标准库中包含日期解析和日期格式化功能。为什么不直接使用这些?

    import datetime
    
    def date_conversion(date_string):
      try:
        dt = datetime.datetime.strptime(date_string, '%d/%m/%y')
      except ValueError:  # invalid input string
        return None
      if dt.year >= 2018: 
        dt = dt.replace(year=dt.year - 100)  # change century
      return dt.strftime('%d-%m-%Y')
    

    通过使用它,您还可以确保不是实际日期(例如 35/01/78)的输入被拒绝。

    此处记录了日期时间格式字符串的用法:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

    【讨论】:

      【解决方案3】:

      为了让例外工作,它应该是

      except ValueError: 
      

      而不是

      except(AttributeError, SyntaxError, TypeError):
      

      下面的函数应该可以正常工作:

      # Convert date inputs
      def convert_day(day_string):
          if int(day_string) < 10:
              return (day_string).zfill(2)
          else:
              return day_string
      
      
      def convert_month(month_string):
          if int(month_string) < 10:
              return (month_string).zfill(2)
          else:
              return month_string
      
      
      def convert_year(year_string):
          if int(year_string) < 18:
              return('20'+(year_string))
          elif int(year_string) < 99:
              if int(year_string) >= 18:
                  return('19'+(year_string))
          else:
              return year_string
      
      
      # form date string
      
      def date_conversion(date_string):
          try:
              date_as_list = date_string.split('/')
              a = convert_day(date_as_list[0])
              b = convert_month(date_as_list[1])
              c = convert_year(date_as_list[2])
      
              k = a + '-' + b + '-' + c
              print(k)
      
          except ValueError:
              print('Not a valid date.')
              # return None
      # 2 Test cases
      date_conversion('19/8/16')
      date_conversion('asfsdfggdf')
      

      上面代码的结果将是

      19-08-2016
      Not a valid date.
      
      Process finished with exit code 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2012-04-14
        • 1970-01-01
        • 2019-06-26
        • 2015-07-08
        • 2013-04-13
        相关资源
        最近更新 更多