python 嵌套型partials的使用

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

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 嵌套型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中的嵌套循环详情

    目录 1 什么是嵌套循环 2 Python 嵌套 for 循环 2.1 嵌套循环打印图案 2.2 在 for 循环中的while循环 2.3 实践:打印一个带有 5 行 3 列星形的矩形图案 3 打破嵌套循环 4 继续嵌套循环 5 使用列表理解的单行嵌套循环 6 Python中的嵌套while循环 6.1 While 循环内的 for 循环 7 何时在 Python 中使用嵌套循环? 1 什么是嵌套循环 所谓嵌套循环就是一个外循环的主体部分是一个内循环.内循环或外循环可以是任何类型,例如 whi

  • Python函数的嵌套详解

    Python允许在函数中定义函数,这通常被称为嵌套函数或者内部函数. def speak(text): def my_lower(t): return t.lower() + '...' return my_lower(text) print(speak('Aomi')) 每次调用speak()时,都会调用一个新的内部函数my_lower()并立即调用. 但是my_lower()只存在于speak内部,那怎么才能从speak外部访问嵌套的my_lower()函数呢? 由于函数是对象,因此可以将内

  •   Python入门必读的if语句嵌套方法

    前言: 前面章节:Python if else条件语句形式详解,详细介绍了 3 种形式的条件语句,即 if.if else 和 if elif else,这 3 种条件语句之间可以相互嵌套. 例如,在最简单的 if 语句中嵌套 if else 语句, 形式如下: if 表达式 1:    if 表示式 2:        代码块 1    else:        代码块 2 再比如,在 if else 语句中嵌套 if else 语句, 形式如下: if 表示式 1:    if 表达式 2:

  • 学习python 的while循环嵌套

    目录 while 循环嵌套 1 基本架构了解 2 打印一个三角形 2.1 练习打印一个距形 3 while嵌套实现九九乘法表  3.1 练习矩阵打印 总结 while 循环嵌套 1 基本架构了解 今天学习while循环嵌套.我们先看一个例子: i=0 while i<3: print("这是第%d行"%i) j=0 while j<4: print("学python") j+=1 print() i+=1  在上面的代码中,外层循环执行一次,内层循环会执

  • python中字典和列表的相互嵌套问题详解

    目录 1.列表中存储字典: 1.列表中存储多个字典 2.访问列表中字典的值 3.遍历访问多个值 2.字典中存储列表 1.访问字典中的列表元素 2.访问字典中的值(字典中的值为列表) 3.字典中存储字典 1.字典中不能全部由字典元素组成,会报错. 2.字典中的值可由字典组成 4.容易出的小错误: 总结 首先明确: 1.访问字典中的元素:dict_name[key] / dict_name.get(key) 2.访问列表中的元素:list_name[索引] 1.列表中存储字典: 1.列表中存储多个字

  • Python爬虫之Selenium中frame/iframe表单嵌套页面

    在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中. 本章中用到的关键方法如下: switch_to.frame():切换为frame/iframe表单的内嵌页面中 switch_to.parent_frame():退出内嵌页面 以ip138网站为例 f

  • python 嵌套型partials的使用

    要实现的目标,简单示例: 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 可以到最后的看解决方法 场景: 为

  • python中 @的含义以及基本使用方法

    目录 一.表示修饰符. 二.表示矩阵乘法. 总结 一.表示修饰符. 可以在模块或者类的定义层内对函数进行修饰.出现在函数定义的前一行,不允许和函数定义在同一行. 一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西(如果返回不是一个可调用的对象那么会报错). 例1: def funA(desA): print("It's funA") def funB(desB): print("It's funB") @funA def fu

  • Python3操作YAML文件格式方法解析

    数据及配置文件之争 数据及文件通常有三种类型: 配置文件型:如ini,conf,properties文件,适合存储简单变量和配置项,最多支持两层,不适合存储多层嵌套数据 表格矩阵型:如csv,excel等,适合于存储大量同类数据,不适合存储层级结构的数据 多层嵌套型:如XML,HTMl,JSON.YAML,TOML等,适合存储单条或少数多层嵌套数据,不适合存储大量数据 YAML兼容JSON格式,简洁,强大,灵活,可以很方便的构造层级数据并快速转为Python中的字典. YAML简介 YAML(Y

  • JSP学习心得

    作者:徐春金 下面是本人在学习JSP时的一些心得: 一.JSP工作原理 在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet.而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet. JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息:如果转换成功, JSP引擎用javac把该Java源文件编译成相应的class文件.然后创建一个该S

  • JSP学习经验小结分享

    对简单应用,可采用JSP+BAEN,对复杂的应用系统,应采用JSP+EJB,SERVLET变的无足轻重.用JSP完全可替代它. 一.JSP工作原理 在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet.而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet. JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息:如果转换成功, JSP引

  • python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例

    这几天研究了下PyQt5中QWebEngineView内嵌网页与Python的数据交互,今天把实例方法与代码发布出来供大家参数 数据交互需要load进一个网页,这里我选择load进一个本地html网页:JSTest.html. 同时,QWebEngineView与外面的交互还需要Qt官方提供的一个js文件:qwebchannel.js,这个文件可以在网上下载. JSTest.html和qwebchannel.js两个文件放在同一个目录下,我这边都是放在Python工程目录下. qwebchann

  • C++通过内嵌解释器调用Python及间接调用Python三方库

    目录 1.移植Python解释器 2.VS配置(VS2017为例,此教程与VS版本无关) 3.C++调用程序样例 4.被调Python程序样例 本文章目的是脱离安装Python环境的前提下,由C++程序调用Python程序及Python相关三方库 1.移植Python解释器 Python环境的目录结构 路径详解 需要用的如下图 1.红色部分是生成路径下解释器运行时依赖 将红色部分拷贝到C++编译主ExE路径下即可 2.蓝色部分是VS配置编译时依赖 路径或文件名 作用 DLLs Python内部运

  • Perl 与 Python 之间的一些异同整理

    关于 Perl 与 Python 的起源和特点 Perl 是 Practical Extraction and Report Language 的简称,由 1987 年 Larry Wall 创建,最初的目的是为了在 UNIX 上方便处理报表,经过长期的发展已经成为一种全功能的程序设计语言,当前最新的版本为 Perl5.14.1,Perl 作为一种自由而强大的编程语言,其中心思想是: There's More Than One Way To Do It.(不只一种方法來做这件事 ),即「 Tim

  • 比较详细Python正则表达式操作指南(re使用)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.使用这个小型语言,你可以为想要匹配的相应字符串集指定规则:该字符串集可能包含英文语句.e-mail地址.TeX命令或任何你想搞定的东西.然後你可以问诸如"这个字符串匹配该模式吗?"或"在这个字符串中是否有部分匹配该模式呢?".你也可以使用 RE 以各种方式来修改或分割字符串. 正则表达式模式被编译成一系列的字节码,然後由用 C

  • Python编程之Re模块下的函数介绍

    re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA') #等价于 re.search('A','CBA') print m <_sre.SRE_Match object at 0x9d690c8> #匹配到了,返回MatchObject(True) m=pat.search('CBD') print m None #没有匹配到,返回None(False) search(pattern,

随机推荐