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)的使用相关推荐

  1. Android关于小米相册悬浮标题栏、冻结标题栏的实现方式(嵌套型RecycleView)

    本文原创自selfreeyuan,转载请注明出处: http://blog.csdn.net/selfreeyuan/article/details/50674009 效果图如下: 网上完全查找不到关 ...

  2. 《泛型编程与stl》

    以下是STL六大组件(componments): adapters  配接器 用来修饰其他组件.包括iterator adapters.function  adapters.container ada ...

  3. Handlebars partials 隐藏的力量

    一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...

  4. handlebars.php,Handlebars partials 隐藏的力量

    一个项目的机会再加上我自己的探索,让我对Handlebars partials有了更深的理解.事实证明,你可以做得比我了解的更多. 我最近在负责一个小项目,只有很少的静态页面.因为太小了,我们最开始没 ...

  5. python 处理json多层嵌套_python解析多层嵌套json

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这样多层json结构已完成. 补充拓展:python 读取多层嵌套的json数据 ...

  6. Python - 移除List中重复项的五种常用方法

    简 介: 本文列些处几种去除在Python 列表中(list)可能存在的重复项,这在很多应用程序中都会遇到的需求,作为程序员最好了解其中的几种方法 以备在用到时能够写出有效的程序. 关键词: list ...

  7. Python是否具有三元条件运算符?

    如果Python没有三元条件运算符,是否可以使用其他语言构造来模拟一个? #1楼 对于Python 2.5及更高版本,有一种特定的语法: [on_true] if [cond] else [on_fa ...

  8. python是一种编译的编程语言_Python这种编程语言

    python的创始⼈人为吉多·范罗苏姆(Guido van Rossum).1989年年的圣诞节期间,吉多· 范罗苏姆为了了在阿姆斯特丹丹打发时间,决⼼心开发⼀一个新的脚本解释程序,作为ABC语⾔言的 ...

  9. Python IDE:PyCharm中的那些实用功能

    到目前为止,我用Eclipse已经有一些年头了,大部分的时间都是用来写Python(安装Pydev插件)以及C++(安装CDT插件). 最近我从一个好友那听说了PyCharm以及它新的免费社区版log ...

最新文章

  1. [重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏
  2. DNN 数据访问策略 (转)
  3. 五分钟体验SpringBoot+Skywalking
  4. 2021-春季学习-智能车技术创新与实践-Lesson3
  5. app息屏后ajax请求不执行_息屏时钟app下载-息屏时钟软件下载v1.0 安卓版
  6. STM32库中几个重要的文件说明
  7. 【收藏】138条 Vim 命令、操作、快捷键全
  8. 你知道CSDN有多少VIP用户吗?
  9. 没用过这几招,别说你会使用Jupyter Notebook
  10. 也说说angularJs里的evalAsync
  11. Sequence of methods in form and table in AX
  12. iOS扫码识别之后添加震动/播放声音提示、歌词解析并随音乐滚动显示(包含demo源码)
  13. 什么是存储过程?为什么要写存储过程
  14. python爬虫-scrapy基于selenium进行网页截图
  15. 16比9尺寸是多少厘米_16比9尺寸换算方法
  16. 如何获取dll或exe的模块名
  17. linux禁止软件连接指定网站,利用iptables来配置linux禁止所有端口登陆和开放指定端口...
  18. 数据库与MPP数仓(十五):MPP的架构与选型
  19. Python pandas库|任凭弱水三千,我只取一瓢饮(7)
  20. DVWA全关教程手册

热门文章

  1. 搞懂Java的反射机制
  2. html section 布局,section标签的用法
  3. yarn 怎么查看有多个job在跑_flink on yarn 模式下提示yarn资源不足问题分析
  4. 不出现php version网页_php冷知识 - 从命令行参数列表中获取选项
  5. PHP中的语法特点小结
  6. azkaban的操作指南
  7. Ubuntu 键盘错位解决 更改键盘布局
  8. 在线mod计算机,MOD大师教程 手把手教你改造电脑机箱
  9. 计算机科学与技术pdf,计算机科学与技术(.PDF
  10. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键