IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python 嵌套型partials(nested partials)、partial对象中包含partial对象的使用 -> 正文阅读

[Python知识库]python 嵌套型partials(nested partials)、partial对象中包含partial对象的使用

嵌套型partial,partial对象中包含partial对象的使用

要实现的目标:

from functools import partial


def func1(f):
    return f


def func2(f1):
    return f1


def func(n):
    return n


p = partial(func2, partial(func1, partial(func, 5)))
print(p()()())
# 输出5

简化嵌套式的partial对象p,不要调用三次

p()
# 输出5

可以直接跳到最后的看解决方法
场景:
为了实现一个通用性较高的sql生成方法,我写了一个通用的转换时间格式的方法,简略版大概如下

def date_trunc(time_unit: str, field):
    return f'date_trunc("{time_unit}", `{field}`)'


print(date_trunc("WEEK", "event_date"))
print(date_trunc("DAY", "event_date"))
...

实际就是sql中的date_trunc方法
输出

date_trunc("WEEK", `event_date`)
date_trunc("DAY", `event_date`)

由于校验时间格式类型和时间格式转换是前后挨着执行的
我把上面的几个方法写进了一个Enum对象TimeFormatter,使用partial将date_trunc方法包起来以充当Enum的成员
这样在校验格式类型完之后立马调用它本身执行格式转换:校验格式的时候传入的是time_unit,然后执行相应的格式转换date_trunc

from enum import Enum
from functools import partial


def date_trunc(time_unit: str, field):	# 注意这里的date_trunc和上面简略版举例的有所不同,需要两个参数
    return  f'date_trunc("{time_unit}", `{field}`)'


class TimeFormatter(Enum):
    DAY = partial(date_trunc, "DAY")
    WEEK = partial(date_trunc, "WEEK")
    MONTH = partial(date_trunc, "MONTH")

    def __call__(self, *args, **kwargs):
        return self.value(*args, **kwargs)

这里的call方法让Enum对象TimeFormatter的成员变得可以被调用(callable),关于Enum的一些用法可以参考我上期的文章
到这里我依然可以正常调用我的date_trunc方法

field = "event_time"
tf_wk = TimeFormatter.__getattr__("WEEK")	# 先校验格式
print(tf_wk(field))		# 传入相应的field对象就会执行对应的date_trunc方法截断时间
tf_day = TimeFormatter.__getattr__("DAY")	# 校验格式
print(tf_day(field))	# 执行date_trunc

输出

date_trunc("WEEK", `event_time`)
date_trunc("DAY", `event_time`)

直到我想要使用二次时间格式转换时:

from_timestamp(date_trunc("DAY", `event_time`), "yyyy-MM-dd")

发现好像没那么顺利地执行时间格式转换:

from enum import Enum
from functools import partial


def from_timestamp(field, time_fmt: str):
    return f'from_timestamp(`{field}`, "{time_fmt}")'


class TimeFormatter(Enum):
    HOUR = partial(from_timestamp, partial(date_trunc, "HOUR"))

    def __call__(self, *args, **kwargs):
        return self.value(*args, **kwargs)


tf_hour = TimeFormatter.__getattr__("HOUR")
print(tf_hour("event_hour"))

输出

from_timestamp(`functools.partial(<function date_trunc at 0x000002538E45E5E0>, 'HOUR')`, "event_hour")

不是想要的结果

查了一些解决办法,又是循环调用,又是组合函数(function composition)的,
最后发现可以用一个简单的方法解决:
焯!

from enum import Enum
from functools import partial


def date_trunc(time_unit: str, field):
    return f'date_trunc("{time_unit}", `{field}`)'


def from_timestamp(field, time_fmt: str):
    return f'from_timestamp(`{field}`, "{time_fmt}")'


def fts(time_fmt, time_unit, field):
    return from_timestamp(date_trunc(time_unit, field), time_fmt)


class TimeFormatter2(Enum):
    month = partial(fts, "yyyy-MM", "month")

    def __call__(self, *args, **kwargs):
        return self.value(*args, **kwargs)

输出

from_timestamp(`date_trunc("month", `acmonth`)`, "yyyy-MM")

前面简单示例的解决方法

def nested_partials(f2, f1, n):
    return f2(f1(n))


p = partial(nested_partials, func2, func1)
print(p(5))

输出

5
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 22:52:51  更:2021-12-28 22:53:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:28:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码