python 嵌套型partials(nested partials)的使用
Python嵌套型partial的使用
partial对象中包含partial对象的使用
要实现的目标,简单示例:
from functools import partialdef func1(f):return fdef func2(f1):return f1def func(n):return np = 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的成员,实现用Enum类校验日期参数
,用Enum类成员的date_trunc方法执行日期截断
这样在校验完日期参数
后立马调用它本身的date_trunc方法执行日期截断
:执行日期截断
date_trunc方法时需要传入参数time_unit
,也就是"DAY", “WEEK”, "MONTH"等字符串
from enum import Enum
from functools import partialdef 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`)
直到我想要使用二次的时间格式转换时,也就是在date_trunc之后再执行一个from_timestamp将sql中的日期对象event_time转换为指定的"yyyy-MM-dd"格式
from_timestamp(date_trunc("DAY", `event_time`), "yyyy-MM-dd")
发现好像没那么顺利地执行时间格式转换:
from enum import Enum
from functools import partialdef 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 partialdef 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 嵌套型partials(nested partials)的使用相关推荐
- Android关于小米相册悬浮标题栏、冻结标题栏的实现方式(嵌套型RecycleView)
本文原创自selfreeyuan,转载请注明出处: http://blog.csdn.net/selfreeyuan/article/details/50674009 效果图如下: 网上完全查找不到关 ...
- 《泛型编程与stl》
以下是STL六大组件(componments): adapters 配接器 用来修饰其他组件.包括iterator adapters.function adapters.container ada ...
- Handlebars partials 隐藏的力量
一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...
- handlebars.php,Handlebars partials 隐藏的力量
一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...
- python 处理json多层嵌套_python解析多层嵌套json
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这样多层json结构已完成. 补充拓展:python 读取多层嵌套的json数据 ...
- Python - 移除List中重复项的五种常用方法
简 介: 本文列些处几种去除在Python 列表中(list)可能存在的重复项,这在很多应用程序中都会遇到的需求,作为程序员最好了解其中的几种方法 以备在用到时能够写出有效的程序. 关键词: list ...
- Python是否具有三元条件运算符?
如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个? #1楼 对于Python 2.5及更高版本,有一种特定的语法: [on_true] if [cond] else [on_fa ...
- python是一种编译的编程语言_Python这种编程语言
python的创始⼈人为吉多·范罗苏姆(Guido van Rossum).1989年年的圣诞节期间,吉多· 范罗苏姆为了了在阿姆斯特丹丹打发时间,决⼼心开发⼀一个新的脚本解释程序,作为ABC语⾔言的 ...
- Python IDE:PyCharm中的那些实用功能
到目前为止,我用Eclipse已经有一些年头了,大部分的时间都是用来写Python(安装Pydev插件)以及C++(安装CDT插件). 最近我从一个好友那听说了PyCharm以及它新的免费社区版log ...
最新文章
- [重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏
- DNN 数据访问策略 (转)
- 五分钟体验SpringBoot+Skywalking
- 2021-春季学习-智能车技术创新与实践-Lesson3
- app息屏后ajax请求不执行_息屏时钟app下载-息屏时钟软件下载v1.0 安卓版
- STM32库中几个重要的文件说明
- 【收藏】138条 Vim 命令、操作、快捷键全
- 你知道CSDN有多少VIP用户吗?
- 没用过这几招,别说你会使用Jupyter Notebook
- 也说说angularJs里的evalAsync
- Sequence of methods in form and table in AX
- iOS扫码识别之后添加震动/播放声音提示、歌词解析并随音乐滚动显示(包含demo源码)
- 什么是存储过程?为什么要写存储过程
- python爬虫-scrapy基于selenium进行网页截图
- 16比9尺寸是多少厘米_16比9尺寸换算方法
- 如何获取dll或exe的模块名
- linux禁止软件连接指定网站,利用iptables来配置linux禁止所有端口登陆和开放指定端口...
- 数据库与MPP数仓(十五):MPP的架构与选型
- Python pandas库|任凭弱水三千,我只取一瓢饮(7)
- DVWA全关教程手册
热门文章
- 搞懂Java的反射机制
- html section 布局,section标签的用法
- yarn 怎么查看有多个job在跑_flink on yarn 模式下提示yarn资源不足问题分析
- 不出现php version网页_php冷知识 - 从命令行参数列表中获取选项
- PHP中的语法特点小结
- azkaban的操作指南
- Ubuntu 键盘错位解决 更改键盘布局
- 在线mod计算机,MOD大师教程 手把手教你改造电脑机箱
- 计算机科学与技术pdf,计算机科学与技术(.PDF
- Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键