python 嵌套型partials(nested partials)的使用
Python嵌套型partial的使用
partial對象中包含partial對象的使用
要實現的目標,簡單示例:
簡化嵌套式的partial對象p,不要調用三次
p() # 輸出5可以直接跳到最后的看解決方法
場景:
為了實現一個通用性較高的sql生成方法,我寫了一個通用的轉換時間格式的方法,簡略版大概如下
實際就是sql中的date_trunc方法
輸出
由于校驗日期參數和日期截斷是前后挨著執行的
我把上面的幾個方法寫進了一個Enum對象TimeFormatter
使用partial將date_trunc方法包起來以充當Enum的成員,實現用Enum類校驗日期參數,用Enum類成員的date_trunc方法執行日期截斷
這樣在校驗完日期參數后立馬調用它本身的date_trunc方法執行日期截斷:執行日期截斷date_trunc方法時需要傳入參數time_unit,也就是"DAY", “WEEK”, "MONTH"等字符串
這里的call方法讓Enum對象TimeFormatter的成員變得可以被調用(callable),關于Enum的一些用法可以參考我上期的文章
到這里我依然可以正常調用我的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_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)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机语言恢复,win10系统找回消失不
- 下一篇: 数据结构之堆:堆的介绍与python实现