【问题标题】:Conditional string representation based on variable type基于变量类型的条件字符串表示
【发布时间】:2018-05-18 10:11:32
【问题描述】:

我想创建一个可以包含None 值的datetime 对象的字符串表示形式。到目前为止,我想出了一个解决方案,但我正在寻找一种更好/更清洁的方法。

假设我有以下两个变量:

import datetime as dt

a = None
b = dt.datetime(2017, 11, 30)


def str_format(str):
    return '{:%Y-%m-%d}'.format(str)

以下将返回格式化字符串:

str_format(b)
'2017-11-30'

但以下会返回错误:

str_format(a)
TypeError: unsupported format string passed to NoneType.__format__

到目前为止,我可以找到以下解决方案:

def str_format(str):
    if isinstance(str, type(None)) is False:
        return '{:%Y-%m-%d}'.format(str)
    else:
        return '{}'.format(str)

str_format(a)
'None'

str_format(b)
'2017-11-30'

但是,我正在寻找一种更有效/更简洁的方法来编写函数。

【问题讨论】:

  • 我认为最好测试一下你的参数是否是日期时间类型。 isinstance(b, dt.datetime),你确定你的格式正确

标签: python string date datetime format


【解决方案1】:

这些类型的东西通常被包裹在 try/except

def str_format(str):
  try:
    return '{:%Y-%m-%d}'.format(str)
  except TypeError:
    # unrecognized type, return blank or whatever you want to return
    return ''

this 问题的答案解释了为什么您通常使用try/except 而不是相当好的条件检查。

【讨论】:

    【解决方案2】:

    您的功能过于复杂。 None 是一个单例,因此针对它进行测试的 Pythonic 方法就是 is None

    只需一行三元表达式即可:

    def str_format(s):
       return str(s) if s is None else '{:%Y-%m-%d}'.format(s)
    

    如果通过了None,则返回默认日期(例如:2010 年 1 月 1 日):

    def str_format(s):
       return '{:%Y-%m-%d}'.format(s or dt.datetime(2010, 1, 1))
    

    作为旁注,不要使用 str 作为变量名,因为它是 python 字符串类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2019-06-19
      • 2019-09-26
      相关资源
      最近更新 更多