我正在重构一个转换各种日期格式的函数(即 ISO 8601 字符串,datetime.date
, datetime.datetime
等)转换为 Unix 时间戳。
我想要使用新功能@singledispatch
而不是类型检查,但我不知道如何保留前一个函数的类型提示:
旧功能:使用类型检查
import datetime
from typing import Union
MyDateTimeType = Union[int, str, datetime.datetime, datetime.date, None]
# How do I retain this functionality with @singledispatch?
# ⬇️⬇️⬇️⬇️⬇️⬇️⬇️
def to_unix_ts(date: MyDateTimeType = None) -> Union[int, None]:
"""Convert various date formats to Unix timestamp..."""
if type(date) is int or date is None:
return date
if type(date) is str:
# Handle string argument...
elif type(date) is datetime.datetime:
# Handle datetime argument...
elif type(date) is datetime.date:
# Handle date argument...
新功能:使用@singledispatch
import datetime
from functools import singledispatch
from typing import Union
@singledispatch
def to_unix_ts(date) -> Union[int, None]:
"""Handle generic case (probably string type)..."""
@to_unix_ts.register
def _(date: int) -> int:
return date
@to_unix_ts.register
def _(date: None) -> None:
return date
@to_unix_ts.register
def _(date: datetime.datetime) -> int:
return int(date.replace(microsecond=0).timestamp())
# etc...
我已经探索过构建支持的类型,如下所示:
supported_types = [type for type in to_unix_ts.registry.keys()]
MyDateTimeType = Union(supported_types) # Example, doesn't work
...这样它就可以通过未来的 @singledispatch 注册进行扩展,但我无法让它工作。
我怎样才能添加Union[...]
样式类型提示@singledispatch
以可扩展的方式运行?