如何在评估值时强制pythons格式化方法放置值

时间:2019-07-05 08:45:42

标签: python datetime string-formatting

我需要根据日期来计算会计年度,而我将格式化方法与datetime.datetime对象一起使用时,它会为具有不同值的相同类型对象生成意外结果

下面是我的代码。

from datetime import datetime

dt = datetime.strptime('2019-03-03','%Y-%m-%d')
## Below line is killing my mind as it is resulting 2019-2018
print('{}-{}'.format(dt.year, (dt.year+1)%100 if dt.month > 3 else dt.year-1,(dt.year)%100))
# This will produce the result 3 2019 19
print(dt.month, dt.year, (dt.year)%100)

dt = datetime.strptime('2019-04-04','%Y-%m-%d')
# But the below line is working fine as it is resulting 2019-20
print('{}-{}'.format(dt.year, (dt.year+1)%100 if dt.month > 3 else dt.year-1,(dt.year)%100))
# This will produce the result 4 2019 19
print(dt.month, dt.year, (dt.year)%100)

我期望结果

2018-19 if dt = datetime.strptime('2019-03-03','%Y-%m-%d')
2019-20 if dt = datetime.strptime('2019-04-04','%Y-%m-%d')

我无法弄清楚代码的问题。

1 个答案:

答案 0 :(得分:1)

## Below line is killing my mind as it is resulting 2019-2018
print('{}-{}'.format(dt.year, (dt.year+1)%100 if dt.month > 3 else dt.year-1,(dt.year)%100))

好的,让我们分解一下代码:

'{}-{}'.format(dt.year, (dt.year+1)%100 if dt.month > 3 else dt.year-1,(dt.year)%100)

您有2个{},但有3个(!)参数:

  • dt.year
  • (dt.year+1)%100 if dt.month > 3 else dt.year-1
  • (dt.year)%100(由于只有2个{}而被忽略)

如您所见,if/else仅适用于中间参数。

您想要的是在两个参数上都使用此if,因此您需要重复if或使用括号对事物进行分组。但是分组将导致一个元组,因此您需要使用*解压缩值(我在注释中提到了分组,但是忘记了解压缩)。

有两个if的解决方案:

'{}-{}'.format(dt.year if dt.month > 3 else dt.year-1, 
               (dt.year+1)%100 if dt.month > 3 else (dt.year)%100)

如您所见,一个逗号-两个参数。将其分成两行以提高可读性。

一个if和元组拆包的解决方案:

'{}-{}'.format( *(dt.year, (dt.year+1)%100) if dt.month > 3 else *(dt.year-1,(dt.year)%100) )

为什么要拆包?因为'{}-{}'.format( ('2018','19') )得到一个作为元组的参数,而不是两个参数。它不知道该怎么办。前面的*解压缩列表或元组并将其作为常规参数提供。 -详细了解here in the documentation