跳过一些文件,选取一些比较优秀学习。今天看到dateformat文件。
头文件中给出例子
>>> import datetime
>>> d = datetime.datetime.now()
>>> df = DateFormat(d)
>>> print(df.format('jS F Y H:i'))
7th October 2003 11:39
>>>
可以看到重点是DateFormat(d)和 df.format('jS F Y H:i')
分析文件结构
...
re_formatchars = re.compile(r'(?<!\\)([aAbBcdDeEfFgGhHiIjlLmMnNoOPrsStTUuwWyYzZ])')
re_escaped = re.compile(r'\\(.)')
class Formatter(object):
def format(self, formatstr):
pieces = []
for i, piece in enumerate(re_formatchars.split(force_text(formatstr))):
if i % 2:
pieces.append(force_text(getattr(self, piece)()))
elif piece:
pieces.append(re_escaped.sub(r'\1', piece))
return ''.join(pieces)
class TimeFormat(Formatter):
def __init__(self, t):
self.data = t
def a(self):
"'a.m.' or 'p.m.'"
if self.data.hour > 11:
return _('p.m.')
return _('a.m.')
...
class DateFormat(TimeFormat):
year_days = [None, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
def __init__(self, dt):
# Accepts either a datetime or date object.
self.data = dt
self.timezone = None
if isinstance(dt, datetime.datetime):
if is_naive(dt):
self.timezone = LocalTimezone(dt)
else:
self.timezone = dt.tzinfo
def b(self):
"Month, textual, 3 letters, lowercase; e.g. 'jan'"
return MONTHS_3[self.data.month]
…
def format(value, format_string):
"Convenience function"
df = DateFormat(value)
return df.format(format_string)
def time_format(value, format_string):
"Convenience function"
tf = TimeFormat(value)
return tf.format(format_string)
其中,最开始2句是编译的正则。
接着是Formatter类。类中封装1个函数format(格式化字符串)
接着是TimeFormat,继承至Formatter,用来处理时间
接着是DateFormat,继承至TimeFormat,用来处理日期
接下来是2个函数,分别是日期和时间处理。
整个模块的重点是字符串分割->调用提取时间函数->组合时间字符串
r'(?<!\\)([aAbBcdDeEfFgGhHiIjlLmMnNoOPrsStTUuwWyYzZ])'
正则的意思是匹配前面不是\符号的部分。字符串为aAbBcdDeEfFgGhHiIjlLmMnNoOPrsStTUuwWyYzZ任意的字符串。
拆分以后通过getattr(self,piece)()获得字符串对应的方法并调用。返回对应的时间格式化部分。最终组成1个列表。
在把列表转换为格式化后的字符串。