您的位置:首页 > 编程语言 > Python开发

我的第一个python web开发框架(10)——工具函数包说明(一)

2017-10-23 18:24 731 查看
  PS:原先是想直接进入功能开发,要用到什么函数时再创建,这样也容易熟悉每个函数的由来和使用方法,但考虑到这样操作,到时会经常在不同文件间切换,不好描述,容易造成混乱,所以还是使用函数库这种方式来说明。

  下面来说说工具函数包,如果想要快速学会一个新的框架,首先要做的事情就是熟悉工具函数包,一方面,能快速知道有哪些基本功能可以直接调用,不用重复造轮子;另一方面,查看项目代码时,会比较快的进入角色,能看明白很多代码是做什么用的,因为工具函数包被调用的机率是最大的。

  那么怎么学习呢?当然是有节奏有计划的一步步深入了,我们可以从上到下逐个查看研究,通过查看代码,我们可以基本了解这个包有什么功能,但也仅仅是了解而已,想要真正掌握,必须要去使用它们,最直接的方法就是编写测试用例进行测试,这样就可以很快熟悉并掌握这些函数具体有什么功能与限制。

  PS:大家在学习工具函数,或其他封装好的类或函数时,在开始时不需要去知道它里面每一行代码是做什么用的,为什么要那么写,只需要知道输入什么参数会得出什么值就可以了,这就是大家所说的封装。我们要开汽车,不需要知道它是怎么造出来的,发动机是怎么运行的,只需要知道怎么操作(接口)就可以了。

  我以前遇到过几位爱钻牛角尖的开发者,想弄明白每一行代码为什么要那样写,当那一行所调用的函数看不懂时,就会再深入一层,看看它更底层是什么原理......就这样,一般人用几分钟就可以知道怎么用的,他花几天也弄不明白,花了好长时间也没法写代码。对于初学者来说,学习一个函数怎么使用,不要钻牛角尖,去研究它的内部是怎么运行的,要研究也要等到你以后精通了再说,不然你看到一个函数就去看它的源码,然后源码中又会调用其他库的源码,其他库的源码又会调用python的内核代码,难道你要搞定python的内核代码后才可以开始开发吗?你能搞的定python内核你就是超级大牛了,可以自己开发一种新语言出来了。

  所以说想要快速学习,最好的办法就是知道这个封装好的函数是干嘛的,它需要输入什么参数,会返回什么内容就已经够了。而最快的熟悉方法就是写单元测试,用你能想到的办法去测试,这样就知道什么时候出错,什么时候正常。

  熟悉相关工具函数:

  convert_helper.py是类型转换包,所有字符串转数值、字符串转日期、字符串日期转时间戳等各种类型转换函数,都可以放到这里来。

def timedelta(sign, dt, value):
"""
对指定时间进行加减运算,几秒、几分、几小时、几日、几周、几月、几年
sign: y = 年, m = 月, w = 周, d = 日, h = 时, n = 分钟, s = 秒
dt: 日期,只能是datetime或datetime.date类型
value: 加减的数值
return: 返回运算后的datetime类型值
"""
if not isinstance(dt, datetime.datetime) and not isinstance(dt, datetime.date):
raise Exception("日期类型错误")

if sign == 'y':
year = dt.year + value
if isinstance(dt, datetime.date):
return datetime.datetime(year, dt.month, dt.day)
elif isinstance(dt, datetime.datetime):
return datetime.datetime(year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
else:
return None
elif sign == 'm':
year = dt.year
month = dt.month + value
### 如果月份加减后超出范围,则需要计算一下,对年份进行处理 ###
# 如果月份加减后等于0时,需要特殊处理一下
if month == 0:
year = year - 1
month = 12
else:
# 对年月进行处理
year = year + month // 12
month = month % 12
if isinstance(dt, datetime.date):
return datetime.datetime(year, month, dt.day)
elif isinstance(dt, datetime.datetime):
return datetime.datetime(year, month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond)
else:
return None
elif sign == 'w':
delta = datetime.timedelta(weeks=value)
elif sign == 'd':
delta = datetime.timedelta(days=value)
elif sign == 'h':
delta = datetime.timedelta(hours=value)
elif sign == 'n':
delta = datetime.timedelta(minutes=value)
elif sign == 's':
delta = datetime.timedelta(seconds=value)
else:
return None

return dt + delta


View Code
  timedelta()函数,它主要用于时间的加减运算,可以得出加减几秒、几分、几小时、几日、几周、几月、几年后的时间值是什么,这个函数在实际开发中使用频率还算是挺高的。

  PS:原datetime.timedelta函数没有对年和月的加减运算,对这个我进行了扩展,增加了年和月的加减计算

def test_timedelta(self):
print('---test_timedelta---')
result = datetime.datetime(2018, 9, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('y', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2016, 9, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('y', datetime.datetime(2017, 9, 1), -1), result)
result = datetime.datetime(2018, 3, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), 6), result)
result = datetime.datetime(2017, 3, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), -6), result)
result = datetime.datetime(2017, 3, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('m', datetime.datetime(2017, 9, 1), -6), result)
result = datetime.datetime(2017, 9, 8)
print(result)
self.assertEqual(datetime_helper.timedelta('w', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2017, 8, 25)
print(result)
self.assertEqual(datetime_helper.timedelta('w', datetime.datetime(2017, 9, 1), -1), result)
result = datetime.datetime(2017, 9, 2)
print(result)
self.assertEqual(datetime_helper.timedelta('d', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2017, 8, 31)
print(result)
self.assertEqual(datetime_helper.timedelta('d', datetime.datetime(2017, 9, 1), -1), result)
result = datetime.datetime(2017, 9, 1, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('h', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2017, 8, 31, 23)
print(result)
self.assertEqual(datetime_helper.timedelta('h', datetime.datetime(2017, 9, 1), -1), result)
result = datetime.datetime(2017, 9, 1, 0, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('n', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2017, 8, 31, 23, 59)
print(result)
self.assertEqual(datetime_helper.timedelta('n', datetime.datetime(2017, 9, 1), -1), result)
result = datetime.datetime(2017, 9, 1, 0, 0, 1)
print(result)
self.assertEqual(datetime_helper.timedelta('s', datetime.datetime(2017, 9, 1), 1), result)
result = datetime.datetime(2017, 8, 31, 23, 59, 59)
print(result)
self.assertEqual(datetime_helper.timedelta('s', datetime.datetime(2017, 9, 1), -1), result)


  运行后打印到控制台上的值:

------ini------
---test_timedelta---
2018-09-01 00:00:00
2016-09-01 00:00:00
2018-03-01 00:00:00
2017-03-01 00:00:00
2017-03-01 00:00:00
2017-09-08 00:00:00
2017-08-25 00:00:00
2017-09-02 00:00:00
2017-08-31 00:00:00
2017-09-01 01:00:00
2017-08-31 23:00:00
2017-09-01 00:01:00
2017-08-31 23:59:00
2017-09-01 00:00:01
2017-08-31 23:59:59
------clear------


  本文对应的源码下载

版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

python开发QQ群:669058475 作者博客:http://www.cnblogs.com/EmptyFS/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐