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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCI论文写作训练营笔记汇总04_科技论文写作(技巧篇)

1、语言点 1.1 时态 1.1.1 时态使用的基本原则 1.1.2 在引言部分的时态使用 1.1.3 在“材料与方法”部分的时态使用 1.1.4 在“结果”部分的时态使用 1.1.5 在“讨论”部分的时态使用 1.1.6 总结 1.2 语态 1.2.1 语态-主动/被动 1.2.2 语态-主动/被动的不同点 1.2.2 语态-主…

做怎样的一个自己

1、如果总是患得患失&#xff0c;即使一时的成功&#xff0c;也不可能找到正确的自己。 2、这一次的创业机会错失了&#xff0c;是一件非常遗憾的事。 3、可是我会是更好的我&#xff0c;明天的我会是更加优秀的我&#xff0c;我将要遇见那个超过自己我我。 为自己努力&#…

SCI论文写作训练营笔记汇总05_英文论文投稿流程与常见问题(完)

1 目标期刊的选择 1.1 文章未送审直接被拒稿的常见理由 1.2 目标期刊的选择 1.2.1 学科与影响力 1.2.2 影响因子 1.2.3 审稿平均周期 1.2.4 主编水平 1.2.5 版面费 2 根据期刊要求调整文章 2.1 具体 2.2 期刊的审查重点 2.3 期刊的审查列表 3 其他材料 3.1 稿件作者信息 3.…

【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

题目描述 FJs cows really hate getting wet so much that the mere thought of getting caught in the rain makes them shake in their hooves. They have decided to put a rain siren on the farm to let them know when rain is approaching. They intend to create a rai…

动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题

动态规划&#xff08;Dynamic Programming&#xff09;思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法&#xff0c;每当输入不同值调用递归函数出现大量重复的&#xff08;子&#xff09;输入和调用&#xff08;返回结果&#xff09;时&#xff0c;就可以考虑…

open(/dev/ietctl, O_RDWR) 参数含义

这是文件I/O的常用函数&#xff0c;open函数&#xff0c;open函数用来打开一个设备&#xff0c;他返回的是一个整型变量&#xff0c;如果这个值等于-1&#xff0c;说明打开文件出现错误&#xff0c;如果为大于0的值&#xff0c;那么这个值代表的就是文件描述符。一般的写法是if…

【Pytorch神经网络实战案例】06 逻辑回归拟合二维数据

1 逻辑回归与拟合过程 1.1 准备数据-code_01_moons.py&#xff08;第1部分&#xff09; import sklearn.datasets import torch import numpy as np import matplotlib.pyplot as plt from LogicNet_fun import LogicNet,plot_losses,predict,plot_decision_boundary# 1.1 准…

将Win10包含中文的用户名改为英文的,同时解决Anaconda navigator无法运行jupyter的问题

Win10用户名包含中文字符导致无法在Anaconda navigator直接运行jupyter的问题 本篇文章内容包含&#xff1a; WIN10如何修改"C:\Users\用户名"中的用户名执行1后&#xff0c;也就是用户名修改为英文名后&#xff0c;在Anaconda navigator启动之前无法启动的jupyter…

linux dd使用记录

dd if/dev/sda of/dev/sdb bs10M Linux下显示dd命令的进度&#xff1a;dd if/dev/zero of/tmp/zero.img bs10M count100000想要查看上面的dd命令的执行进度&#xff0c;可以使用下面几种方法&#xff1a; 比如&#xff1a;每5秒输出dd的进度 方法一&#xff1a;watch -n 5 pkil…

【Pytorch神经网络理论篇】 01 Pytorch快速上手(一)概述+张量

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python写一个字符串的数字后缀部分递增的函数

需求&#xff1a; Python处理重名字符串&#xff0c;添加或递增数字字符串后缀 对于2个重名的字符串&#xff0c;添加数字后缀&#xff0c;比如两个重复的字符串s1 “name”, s2 “name”&#xff0c;将s2的名称设置为name_1对应3个或多个重名的字符串&#xff0c;数字部分实…

【Pytorch神经网络理论篇】 02 Pytorch快速上手(二)GPU与CPU张量切换+具有随机值的张量+张量的数学运算

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

解读Android 4.0 Camera原生应用程序的设计思路

解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章&#xff1a; http://my.oschina.net/jerikc/blog/907911. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变…

【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a torch.tensor([[1,2],[3,4]]) print(torch.reshape(a,(1,-1))) # 将其转化为只有1行数据的张量,参数-1表示自动计算 # tensor([[1, 2, 3, 4]]) print(a.reshape((1,-1))) # # 将其转化为只有1行数据的…

写一个包含多个事件四则运算的留存SQL ——impala hive

在实现一个留存业务需求时&#xff0c;碰到了一个难题&#xff0c;我需要提供展示一个按照如下图格式的数据&#xff0c; day 1 ~ day n的第一行是留存用户数量&#xff0c;第二行是一个由多个事件组合执行四则算术运算得到的复合数值&#xff0c;这里碰到的难点主要是第二行的…

做个流量站-聚茶吧, 汇聚茶的地方

犹豫了好久&#xff0c;终于下定决心&#xff0c;做一回个人站长了&#xff0c;虽然没啥经验&#xff0c;但毕竟也是IT科班出身了&#xff0c;准备用一年的事件摸索一下内容站和SEO&#xff0c;看看能否积累点经验&#xff0c;赚点小钱。 推酷-靠爬虫起家的内容站 做内容站&…

V4L2用户空间和kernel层driver的交互过程

这篇文章详细分析了V4L2用户空间和kernel层driver的交互过程&#xff0c;目的只有一个&#xff1a;更清晰的理解V4L2视频驱动程序的系统结构&#xff0c;驱动编程方法&#xff0c;为以后开发视频驱动打好基础既然从用户层出发探究驱动层&#xff0c;这里先贴出应用层code&#…

【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

Python 代理类实现和控制访问与修改属性的权限

本篇文章主要内容 代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类&#xff0c;将想对外公布的属性的访问和控制权交给代理类来操作&#xff0c;保留不想对外公布的属性的访问或控制权&#xff0c;比如只读访问&#xff0c;日志功能 在代理类中实…

php 对象赋值后改变成员变量影响赋值对象

话不多说看代码 <?php class obj {}$obj1new obj();//实例化对象 $obj2$obj1;//赋值新对象 $obj1->name"test";//改变老对象的成员变量属性 var_dump($obj1); var_dump($obj2); $obj2->name"name";//改变新对象的成员变量属性 var_dump($obj1); …