一些Python小技巧

datetime.datetime.astimezone(tz=None)

返回一个使用新时区地方时的 datetime 对象。

from datetime import datetime, timezone, timedelta

cst_zone = timezone(timedelta(hours=8))

cst_dt = datetime(2018, 12, 20, 8, 0, 0, tzinfo=cst_zone)
utc_dt = cst_dt.astimezone(timezone.utc)

utc_dt
# datetime.datetime(2018, 12, 20, 0, 0, tzinfo=datetime.timezone.utc)

os.path.realpath

返回不含有符号链接的文件的绝对路径。

例如在当前目录中,b 软链接到 a。

$ touch a
$ ln -s a b
$ ls -l
-rw-r--r--  1 chi  staff     0B Dec 19 14:27 a
lrwxr-xr-x  1 chi  staff     1B Dec 19 14:27 b -> a

与 abspath 对比:

import os

p = './b'

r1 = os.path.realpath(p)
r2 = os.path.abspath(p)

# r1 /Users/chi/Projects/just4test/a
# r2 /Users/chi/Projects/just4test/b

raise exc from exc

一般用在 try...except... 的 except 中重新抛出错误。使用 from 会让两个错误信息中间提示不同:

不使用 from 时:

During handling of the above exception, another exception occurred:

使用 from 时:

The above exception was the direct cause of the following exception:

pytz

pytz Asia/Shanghai 时间差定义为 8 小时 6 分钟,不正确的使用会造成时间转换错误。例如:

import pytz
from datetime import datetime

utc = pytz.timezone('UTC')  # UTC
shanghai = pytz.timezone('Asia/Shanghai')   # <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

datetime(2019, 1, 1, 8, 0, 0, tzinfo=shanghai).astimezone(utc)
# datetime.datetime(2018, 12, 31, 23, 54, tzinfo=<UTC>)

datetime(2019, 1, 1, 0, 0, 0, tzinfo=utc).astimezone(shanghai)
# datetime.datetime(2019, 1, 1, 8, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

os.path.expanduser(path)

在 Windows 和 Unix 系统中,将 ~ 开头的字符串路径转换为绝对路径。

import os

os.path.expanduser('~')
# '/home/invoker'
目录