python 嵌套型partials的使用

 更新时间:2022年03月30日 14:16:38   作者:Moelimoe  
这篇文章主要介绍了python 嵌套型partials的使用,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的成员,实现用Enum类校验日期参数,用Enum类成员的date_trunc方法执行日期截断
这样在校验完日期参数后立马调用它本身的date_trunc方法执行日期截断:执行日期截断date_trunc方法时需要传入参数time_unit,也就是"DAY", “WEEK”, "MONTH"等字符串

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`)

直到我想要使用二次的时间格式转换时,也就是在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 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 嵌套型partials的使用的文章就介绍到这了,更多相关python 嵌套型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中__init__.py文件的作用详解

    Python中__init__.py文件的作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件.这篇文章主要介绍了Python中__init__.py文件的作用详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • python 如何用map()函数创建多线程任务

    python 如何用map()函数创建多线程任务

    这篇文章主要介绍了python 使用map()函数创建多线程任务的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 浅谈Python中函数的参数传递

    浅谈Python中函数的参数传递

    下面小编就为大家带来一篇浅谈Python中函数的参数传递。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Python使用xlrd模块操作Excel数据导入的方法

    Python使用xlrd模块操作Excel数据导入的方法

    这篇文章主要介绍了Python使用xlrd模块操作Excel数据导入的方法,涉及Python操作xlrd模块的技巧,需要的朋友可以参考下
    2015-05-05
  • tensorboard 可以显示graph,却不能显示scalar的解决方式

    tensorboard 可以显示graph,却不能显示scalar的解决方式

    今天小编就为大家分享一篇tensorboard 可以显示graph,却不能显示scalar的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python获取接口请求耗时的方法详解

    Python获取接口请求耗时的方法详解

    你想知道我们请求一个url的时候,握手和请求资源分别占用多长时间么?今天我们就来使用python写个小案例来看看,感兴趣的可以跟随小编一起了解一下
    2023-04-04
  • Python实现指定范围内筛选并剔除Excel表格中的数据

    Python实现指定范围内筛选并剔除Excel表格中的数据

    这篇文章主要为大家详细介绍了Python如何实现在指定范围内筛选并剔除Excel表格中的数据,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-06-06
  • python实现随机加减法生成器

    python实现随机加减法生成器

    这篇文章主要为大家详细介绍了python实现随机加减法生成器,练手小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Python数据分析之Matplotlib的常用操作总结

    Python数据分析之Matplotlib的常用操作总结

    Matplotlib是Python的绘图库,它可与NumPy一起使用,提供了一种有效的MatLab开源替代方案,下面这篇文章主要给大家介绍了关于Python数据分析之Matplotlib常用操作的相关资料,需要的朋友可以参考下
    2022-01-01
  • Django基于Models定制Admin后台实现过程解析

    Django基于Models定制Admin后台实现过程解析

    这篇文章主要介绍了Django基于Models定制Admin后台实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论