首页 > 编程语言 >[Python] pipe模块

[Python] pipe模块

时间:2024-05-23 16:29:32浏览次数:27  
标签:function __ Python self pipe Pipe 模块 Filter def

一. 概述

我们都知道在Linux下执行命令ls | sort -r会将排序后的结果进行输出,它是先获取目录数据,管道符|将ls的输出作为后一个命令的输入,最终得到反向排序的结果。

Python和其他大多数语言一样,处理数据的时候通常是将数据作为参数传入。但是有没有像Linux管道符那样优雅的输出呢?有的,这就是pipe模块,但需要注意的是pipe模块并不属于Python的标准库,可用pip pipe进行安装。

二. 使用

pipe的使用方法很简单,只需要给处理数据的函数加上@Pipe注解就OK了。如下,

from pipe import *
@Pipe
def Filter(lst):
	return [x for x in lst if x > 3]

def GetNums():
	return [1, 2, 3, 4, 5]

res = GetNums() | Filter()
print(res)

输出:

[4, 5]

三. 原理

pipe的实现原理和它的使用方式一样简单(正因为简单,才有这篇笔记(╥﹏╥))。它的核心代码只有几行,实际就是一个装饰器。

class Pipe:
    def __init__(self, function):
        self.function = function
        functools.update_wrapper(self, function)

    def __ror__(self, other):
        return self.function(other)

    def __call__(self, *args, **kwargs):
        return Pipe(lambda x: self.function(x, *args, **kwargs))

好,既然这么简单。我们第二章中的例子自己实现一次,并添加了一些注释和辅助分析的输出。

# 装饰器
class Pipe:
	def __init__(self, function):
		print(f"__init__调用,实例id为:{id(self)}")
		self.function = function
		# # 保留传入函数的元信息,可忽略
		# functools.update_wrapper(self, function)

	def __ror__(self, other):
		print(f"__ror__被调用,传入的参数是:{other}")
		return self.function(other)

	def __call__(self, *args, **kwargs):
		print("__call__被调用")
		# 返回的是一个Pipe对象,这样就能够使用重载的“|”
		# 传入一个lambda表达式,是对self.function的再一次封装,回报存在这个Pipe对象的self.function中
		return Pipe(lambda x: self.function(x, *args, **kwargs))

@Pipe
def Filter(lst):
	print("Filter被调用")
	return [x for x in lst if x > 3]
print("----- 分割线 -----")
def GetNums():
	return [1, 2, 3, 4, 5]

res = GetNums() | Filter()
print(res)

输出:

__init__调用,实例id为:2398974542568
----- 分割线 -----
__call__被调用
__init__调用,实例id为:2398974542624
__ror__被调用,传入的参数是:[1, 2, 3, 4, 5]
Filter被调用
[4, 5]

从结果可以看到,Filter()的作用过程是这样的:

  1. Pipe装饰器包装函数Filter
  2. Filter()的调用实际上就是调用Pipe实例中的__call__方法;
  3. __call__方法中,用lambda对实际的Filter函数再做一次封装(其实这个lambda可以省去的,可自行验证),并传入该lambda表达式生成一个新的Pipe对象;
  4. 之后是将GetNums()函数的返回值作为操作数,传入到__ror__中;
  5. __ror__方法中,调用self.function(实际的Filter函数)处理处理数据,返回结果。

标签:function,__,Python,self,pipe,Pipe,模块,Filter,def
From: https://www.cnblogs.com/chasemeng/p/18208845

相关文章

  • 买卖股票相关算法-动态规划-python
    要求1:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不......
  • Pairwise实现(Python篇)
    开篇:测试过程中,对于多参数参数多值的情况进行测试用例组织,之前一直使用【正交分析法】进行用例组织,说白了就是把每个参数的所有值分别和其他参数的值做一个全量组合,用Python脚本实现,就是itertools模块中product方法(又称笛卡尔积法)。组合生成器,例:importitertoolsa=(......
  • python多进程感悟
    对于大量的测试数据,使用多进程时(例如8个进程),最好使用queue来消费数据,不要将测试数据分为8个list,分别送入不同的进程中,因为这样可以避免极端情况出现。例如,每个测试数据处理起来耗时不一样,你刚好把耗时比较长的数据分了同一个list,就会导致其他的进程也会一直等待该进程的完成。......
  • BOSHIDA AC/DC电源模块可靠性是确保设备长时间稳定运行的关键因素
    BOSHIDAAC/DC电源模块可靠性是确保设备长时间稳定运行的关键因素AC/DC电源模块作为一种常见的电源供应设备,被广泛应用于各种电子设备中。它的主要功能是将交流电转换成直流电,并为设备提供稳定的电源供应。AC/DC电源模块的可靠性是确保设备长时间稳定运行的关键因素之一。本文将......
  • Python使用Argparse读取命令参数
    python编写的脚本需要通过命令参数来做一些参数配置。本文将介绍如何使用argparse来解析命令行参数。这种方法相对于sys.args的方式会简单很多。通过以下的脚本来构建一个简单的配置解析器,解析用户名、密码。importargparseimportsysdefmain():  args=sys.ar......
  • 线程模块
    概述该模块基于pthread实现。sylar说,由于c++11中的thread也是由pthread封装实现的,并且没有提供读写互斥量,读写锁,自旋锁等,所以自己封装了pthread。包括以下类:Thread:线程类,构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。线......
  • Linux下安装Python3
    前言Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2写的,所以默认版本不要轻易删除,否则会有一些问题,如果需要使用最新的Python3那么我们可以编译安装源码包到独立目录,这和系统默认环......
  • Python 逗号的巧用
    Python逗号的巧用如果需要在中的列表、字典或集合常量中添加或移除项,记住一个窍门:在所有行后面都添加一个逗号。还不太明白?来看一个示例。假设在代码中有下面这个由名字组成的列表:>>>names=['Alice','Bob','Dilbert']在修改这个名字列表时,通过gitdiff查看改动可能有点......
  • Python pip 安装与使用
    Pythonpip安装与使用pip是Python包管理工具,该工具提供了对Python包的查找、下载、安装、卸载的功能。目前如果你在python.org下载最新版本的安装包,则是已经自带了该工具。注意:Python2.7.9+或Python3.4+以上版本都自带pip工具。pip官网:https://pypi.org/pro......
  • [oeasy]python018_ 如何下载github仓库_git_clone_下载仓库
    继续运行......