python装饰器应用论文_Python装饰器的应用场景代码总结

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 json/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数

不同应用场景下装饰器实现

简单注册表 funcs = []

def register(func):

funcs.append(func)

return func

@register

def a():

return 3

@register

def b():

return 5

# 访问结果

result = [func() for func in funcs]

注册表隔离(使用类的不同实例) class Registry(object):

def __init__(self):

self._funcs = []

def register(self, func):

self._funcs.append(func)

def run_all(self):

return [func() for func in self._funcs]

r1 = Registry()

r2 = Registry()

@r1.register

def a():

return 3

@r2.register

def b():

return 5

@r1.register

@r2.register

执行时封装代码

类型检查 from functools import wraps

def require_ints(func):

@wraps(func) # 将func的信息复制给inner

def inner(*args, **kwargs):

for arg list(args) + list(kwargs.values()):

if not isinstance(arg, int:

raise TypeError("{} 只接受int类型参数".format(func.__name__)

return func(*args, **kwargs)

return inner

用户验证 from functools import wraps

class User(object):

def __init__(self, username, email):

self.username = username

self.email = email

class AnonymousUser(object):

def __init__(self):

self.username = self.email = None

def __nonzero__(self): # 将对象转换为bool类型时调用

return False

def requires_user(func):

@wraps(func)

def inner(user, *args, **kwargs): # 由于第一个参数无法支持self, 该装饰器不支持装饰类

if user and isinstance(user, User):

return func(use, *args, **kwargs)

else:

raise ValueError("非合法用户")

return inner

输出格式化 import json

from functools import wraps

def json_output(func): # 将原本func返回的字典格式转为返回json字符串格式

@wrap(func)

def inner(*args, **kwargs):

return json.dumps(func(*args, **kwargs))

return inner

异常捕获 import json

from functools import wraps

class Error1(Exception):

def __init__(self, msg):

self.msg = msg

def __str__(self):

return self.msg

def json_output(func):

@wrap(func)

def inner(*args, **kwargs):

try:

result = func(*args, **kwargs)

except Error1 as ex:

result = {"status": "error", "msg": str(ex)}

return json.dumps(result)

return inner

# 使用方法

@json_ouput

def error():

raise Error1("该条异常会被捕获并按JSON格式输出")

日志管理 import time

import logging

from functools import wraps

def logged(func):

@wraps(func)

def inner(*args, **kwargs): # *args可以装饰函数也可以装饰类

start = time.time()

result = func(*args, **kwargs)

exec_time = time.time() - start

logger = logging.getLoger("func.logged")

logger.warning("{} 调用时间:{:.2} 执行时间:{:.2}s 结果:{}".format(func.__name__, start, exec_time, result)

带参数的装饰器

带参数的装饰器相当于一个返回装饰器的函数,@deco(a=1)在调用@之前会首先执行deco(a=1)得到一个实际的装饰器, 带参数的装饰器deco(a=1)模块导入时立即执行

装饰类

为类增加可排序功能(而不通过继承子类扩充父类方法,比如多个类需要增加此功能时) import time

from functools import wraps

def sortable_by_created(cls):

original_init = cls.__init__

@wrap(original_init)

def new_init(self, *args, **kwargs):

original_init(*args, **kwargs)

self._created = time.time()

cls.__init__ = new_init

cls.__lt__ = lambda self, other: self._created < other._created

cls.__gt__ = lambda self, other: self._created > other._created

return cls

也可定义一个SortableByCreated()类, 子类使用多重继承其父类和SortableByCreated

类型转换

函数被装饰后有可能变为一个类的实例,此时为了兼容函数调用,应为所返回的类提供__call__方法 class Task(object):

def __call__(self, *args, **kwargs):

return self.run(*args, **kwargs)

def run(self, *args, **kwargs):

raise NotImplementedError("子类未实现该接口")

def task(func):

class SubTask(Task):

def run(self, *args, **kwargs):

func(*args, **kwargs)

return SubTask()

第二章 上下文管理器

定义

包装任意代码

确保执行的一致性

语法

with语句

__enter__和__exit__方法 class ContextManager(object):

def __init__(self):

self.entered = False

def __enter__(self):

self.entered = True

return self

def __exit__(self, exc_type, exc_instance, traceback):

self.entered = False

应用场景

资源清理 import pymysql

class DBConnection(object):

def __init__(self, *args, **kwargs):

self.args,self.kwargs = args, kwargs

def __enter__(self):

self.conn = pymysql.connect(*args, **kwargs)

return self.conn.cursor()

def __exit__(self, exc_type, exc_instance, trackback):

self.conn.close()

异常处理(避免重复)

传播异常(__exit__中return False)

终止异常(__exit__中return True) class BubleExceptions(object):

def __enter__(self):

return self

def __exit__(self, exc_type, exc_instance, trackback):

if exc_instance:

print("出现异常: {}".format(exc_instance)

return False # return True终止异常

处理特定的异常 class HandleValueError(object):

def __enter__(self):

return self

def __exit__(self, exc_type, exc_instance, trackback):

if not exc_type: return True

if issubclass(exc_type, ValueError):

print("处理ValueError: {}".format(exc_instance)

return False

if issubclass...语句改为if exec_type == ValueError则不处理ValueType的子类异常

也可以根据异常的属性来判断是否传播或终止

更简单的语法 import contextlib

@contextlib.contextmanager

def acceptable_error_codes(*codes):

try:

yield

except ShellException as exc_instance:

if exc_instance.code not in codes:

raise

pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

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

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

相关文章

python中try命令_Python 异常处理 Python 基础教程 try..except

异常处理在之前的学习中我们一直没有接触过。 哦对&#xff0c;我们甚至还不知道怎么向程序输入一段字符串。那么我们在这里提供一个小例子。 在命令行中&#xff0c;我们输入 s raw_input(Enter something --> )好了&#xff0c;我们已经知道如何输入一个字符串了&#xf…

python读取大文件性能_强悍的Python读取大文件的解决方案

Python 环境下文件的读取问题&#xff0c;请参见拙文 Python基础之文件读取的讲解这是一道著名的 Python 面试题&#xff0c;考察的问题是&#xff0c;Python 读取大文件和一般规模的文件时的区别&#xff0c;也即哪些接口不适合读取大文件。1. read() 接口的问题f open(filen…

python mysql 保存csv_使用Python将csv文件快速转存到Mysql

因为一些工作需要&#xff0c;我们经常会做一些数据持久化的事情&#xff0c;例如将临时数据存到文件里&#xff0c;又或者是存到数据库里。对于一个规范的表文件(例如csv)&#xff0c;我们如何才能快速将数据存到Mysql里面呢&#xff1f;这个时候&#xff0c;我们可以使用pyth…

python分词_Python 结巴分词实现关键词抽取分析

1 简介 关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期&#xff0c;当时还不支持全文搜索的时候&#xff0c;关键词就可以作为搜索这篇论文的词语。因此&#xff0c;目前依然可以在论文中看到关键词这一项。 除了这些&#xff0…

redis 如何 mysql_Redis 如何保持和 MySQL 数据一致

一、需求起因在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问MySQL等数据库。这个业务场景&#xff0c;主要是解决读数据从Redis缓…

truncate python是删除文件内容吗_在Python中操作文件之truncate()方法的使用教程

truncate()方法截断该文件的大小。如果可选的尺寸参数存在&#xff0c;该文件被截断(最多)的大小。 大小默认为当前位置。当前文件位置不改变。注意&#xff0c;如果一个指定的大小超过了文件的当前大小&#xff0c;其结果是依赖于平台。 注意&#xff1a;此方法不会在当文件工…

sqlserver mysql时间格式化_SqlServer时间格式化

最近用的SqlServer比较多&#xff0c; 时间 格式化 老是忘记&#xff0c;现整理如下&#xff1a;(来源于网上&#xff0c;具体来源地址忘记了&#xff0c;归根到底MSDN吧) SELECT CONVERT(varchar(50), GETDATE(), 0): 05 16 2006 10:57AM SELECT CONVERT(varchar(50), GETDATE…

iframe 跨域_【梯云纵】搞定前端跨域

韦陀掌法,难陀时间善恶&#xff1b;梯云纵,难纵过乱世纷扰。现在开始写代码o(╯□╰)o什么是跨域1.跨域的定义广义的跨域是指一个域下对的文档或者脚本试图去请求另外一个域下的资源。a链接、重定向、表单提交、、、等标签background:url()、font-face()ajax 跨域请求……狭义的…

java中exception_Java中的异常 Exceptions

1. 概念exception是“exceptional event”的缩写&#xff0c;是指执行程序中发生的事件&#xff0c;破坏了程序的正常执行流程。Java 异常处理机制使程序更加健壮易于调试&#xff0c;它可以告诉程序员三个问题&#xff1a;错误的类型、位置、原因&#xff0c;帮助程序员解决错…

python异步asy_Python 异步编程之asyncio【转载】

一、协程的认识 协程&#xff08;Coroutine&#xff09;&#xff0c;也可以被称为微线程&#xff0c;是一种用户态内的上下文切换技术。 简而言之&#xff0c;其实就是通过一个线程实现代码块相互切换执行。例如&#xff1a;deffunc1():print(1) ...print(2)deffunc2():print(3…

bitcount java_Java源码解释之Integer.bitCount

Java中的Integer.bitCount(i)的返回值是i的二进制表示中1的个数。源码如下&#xff1a;public static int bitCount(int i) {// HD, Figure 5-2i i - ((i >>> 1) & 0x55555555);i (i & 0x33333333) ((i >>> 2) & 0x33333333);i (i (i >&…

python自定义全局异常_如何在python中进行全局异常捕获

使用sys.excepthook函数进行全局异常的获取。 首先定义异常处理函数&#xff0c; 并使用该函数接收系统异常信息。 import wx import sys class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, test) btn wx.Button(self, -1, test) btn.Bind(w…

git merge 冲突_卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01;大家好&#xff0c;我是小 G。在座的各位应该都知道&#xff0c;Git 作为居家必备、团队协作之利器&#xff0c;自从 Linus Torvalds 发布这款工具后&#xff0c;便一直受到各路开发者的喜爱…

freebsd java 能用吗_在FreeBSD 4.9下安装JAVA环境

导读&#xff1a;资源下载地址&#xff1a;1.http://www.sun.com/softwarre/java2/download.html2.http://ftp.csie.chu.edu.tw/FreeBSD/distfiles/openmotif/3.http://ameba.sc-uni.ktu.lt/pub/FreeBSD/4.http://www.wormwang.net/mirrors/java/一、以下的包要先下载放到各自的…

python中exec是什么意思_Python中的进程分支fork和exec详解

在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行. 2.fork()是一个很特殊的方法,一次调用,两次返回. 3.fork()它会返回2个值,一个…

java冒泡排序原理_冒泡排序原理及其java实现

冒泡排序原理&#xff1a;临近的数字两两进行比较&#xff0c;按照从小到大或者从大到小的顺序进行交换&#xff0c;这样外层循环每循环一次&#xff0c;都会把一个数的顺序排好(从小到大的话每次都会把上回剩余的数据最大的放在剩余数的最后面&#xff0c;反之则是最小的放剩余…

java holder_java.sql.SQLException: connection holder is null

错误信息2017-11-15 14:53:16.931 [ ] ERROR com.hzcf.flagship.web.AssetPlanController 126 :### Error updating database. Cause: java.sql.SQLException: connection holder is null### Cause: java.sql.SQLException: connection holder is null; uncategorized SQLExcep…

java signed_如何从java中的字节读取signed int?

我有一个规范读取接下来的两个字节是signed int.要在java中读取我有以下内容当我使用以下代码在java中读取signed int时,我得到值65449计算无符号的逻辑int a (byte[1] & 0xff) <<8int b (byte[0] & 0xff) <<0int c ab我认为这是错误的,因为如果我和0xff我…

android 删除文件 代码_代码审计之某系统后台存在任意删除文件

本文作者&#xff1a;霾团队交流群&#xff1a;673441920-----------------------------------------------------------前言POC镇楼&#xff01;&#xff01;&#xff01;POST 漏洞演示过程&#xff1a;首先我们利用D盾监听下我们的项目以外的目录。这里刚刚我们创建了这个文件…

ubuntu java8 java9_在Ubuntu/Debian系统上安装Java 9的方法

本文介绍在Ubuntu/Debian系统上安装Oracle Java 9的方法&#xff1a;使用webupd8team/java PPA&#xff0c;相同的PPA提供了Java 8和Java 7等旧版Java的软件包&#xff0c;如果你的应用程序需要这个&#xff0c;可以随意安装它们。要安装新版本可参考在Ubuntu 18.04系统上安装J…