脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python 嵌套型partials的使用

python 嵌套型partials的使用

2022-11-17 11:52Moelimoe Python

这篇文章主要介绍了python 嵌套型partials的使用,partial对象中包含partial对象的使用,下文更多详细介绍需要的小伙伴可以参考一下

要实现的目标,简单示例:

?
1
2
3
4
5
6
7
8
9
10
11
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,不要调用三次

?
1
2
p()
# 输出5

可以到最后的看解决方法

场景:

为了实现一个通用性较高的sql生成方法,我写了一个通用的转换时间格式的方法,简略版大概如下:

?
1
2
3
4
5
6
7
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"等字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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方法

?
1
2
3
4
5
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"格式

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)的,

最后发现可以用一个简单的方法解决:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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")

焯!原来只要多写一个函数就可以了!

前面简单示例的解决方法:

?
1
2
3
4
5
6
def nested_partials(f2, f1, n):
    return f2(f1(n))
 
 
p = partial(nested_partials, func2, func1)
print(p(5))

输出:

5

到此这篇关于python 嵌套型partials的使用的文章就介绍到这了,更多相关python 嵌套型内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Moelimoe/article/details/122178105

延伸 · 阅读

精彩推荐
  • PythonPython3实现的字典遍历操作详解

    Python3实现的字典遍历操作详解

    这篇文章主要介绍了Python3实现的字典遍历操作,结合实例形式分析了Python3针对字典键、键值及键值对遍历的相关操作技巧,需要的朋友可以参考下...

    快递小可10582021-02-01
  • Pythondjango 外键model的互相读取方法

    django 外键model的互相读取方法

    今天小编就为大家分享一篇django 外键model的互相读取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    JackieLee5382021-04-30
  • Python如何利用Python和OpenCV对图像进行加水印详解

    如何利用Python和OpenCV对图像进行加水印详解

    Python使用opencv是因为觉得它足够强大,很多图像处理这块都是用的它,最近就用opencv添加个水印,这篇文章主要给大家介绍了关于如何利用Python和OpenCV对图像进...

    海拥9162022-02-14
  • Pythonpython异常处理并调试

    python异常处理并调试

    这篇文章主要介绍了python异常处理并调试,异常是错误出现时,可以在正常的控制流程之外采取的行为下面我们就来看看python的那些异常,需要的小伙伴可...

    Silva726572022-09-16
  • Python浅谈python中的@以及@在tensorflow中的作用说明

    浅谈python中的@以及@在tensorflow中的作用说明

    这篇文章主要介绍了浅谈python中的@以及@在tensorflow中的作用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    GZKPeng4812021-09-15
  • Pythonpython base64 decode incorrect padding错误解决方法

    python base64 decode incorrect padding错误解决方法

    这篇文章主要介绍了python base64 decode incorrect padding错误解决方法,本文使用把string补齐等号的方法解决了这个错误,需要的朋友可以参考下 ...

    脚本之家10852020-05-18
  • Pythonpycharm 使用anaconda为默认环境的操作

    pycharm 使用anaconda为默认环境的操作

    这篇文章主要介绍了pycharm 使用anaconda为默认环境的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    AuroraPetard6362021-09-02
  • PythonPython使用functools模块中的partial函数生成偏函数

    Python使用functools模块中的partial函数生成偏函数

    所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法...

    cangmean5852020-08-31