python装饰器常见问题_python 装饰器常见用法

跟踪调用

class tracer: # State via instance attributes

def __init__(self, func): # On @ decorator

self.calls = 0 # Save func for later call

self.func = func

def __call__(self, *args, **kwargs): # On call to original function

self.calls += 1

print('call %s to %s' % (self.calls, self.func.__name__))

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

用例:

@tracer

def spam(a, b, c): # Same as: spam = tracer(spam)

print(a + b + c) # Triggers tracer.__init__

@tracer

def eggs(x, y): # Same as: eggs = tracer(eggs)

print(x ** y) # Wraps eggs in a tracer object

spam(1, 2, 3) # Really calls tracer instance: runs tracer.__call__

spam(a=4, b=5, c=6) # spam is an instance attribute

eggs(2, 16) # Really calls tracer instance, self.func is eggs

eggs(4, y=4) # self.calls is per-function here (need 3.0 nonlocal)

output:

call 1 to spam

6

call 2 to spam

15

call 1 to eggs

65536

call 2 to eggs

256

计时调用

import time

def timer(label='', trace=True): # On decorator args: retain args

class Timer:

def __init__(self, func): # On @: retain decorated func

self.func = func

self.alltime = 0

def __call__(self, *args, **kargs): # On calls: call original

start = time.clock()

result = self.func(*args, **kargs)

elapsed = time.clock() - start

self.alltime += elapsed

if trace:

format = '%s %s: %.5f, %.5f'

values = (label, self.func.__name__, elapsed, self.alltime)

print(format % values)

return result

return Timer

用例:

@timer(label='[CCC]==>')

def listcomp(N): # Like listcomp = timer(...)(listcomp)

return [x * 2 for x in range(N)] # listcomp(...) triggers Timer.__call__

@timer(trace=True, label='[MMM]==>')

def mapcall(N):

return map((lambda x: x * 2), range(N))

for func in (listcomp, mapcall):

print('')

result = func(5) # Time for this call, all calls, return value

func(50000)

func(500000)

func(1000000)

print(result)

print('allTime = %s' % func.alltime) # Total time for all calls

print('map/comp = %s' % round(mapcall.alltime / listcomp.alltime, 3))

output:

[CCC]==> listcomp: 0.00003, 0.00003

[CCC]==> listcomp: 0.00640, 0.00643

[CCC]==> listcomp: 0.08687, 0.09330

[CCC]==> listcomp: 0.17911, 0.27241

allTime = 0.272407666337

[MMM]==> mapcall: 0.00004, 0.00004

[MMM]==> mapcall: 0.01340, 0.01343

[MMM]==> mapcall: 0.13907, 0.15250

[MMM]==> mapcall: 0.27907, 0.43157

[0, 2, 4, 6, 8]

allTime = 0.431572169089

map/comp = 1.584

[0, 2, 4, 6, 8]

单例

class singleton:

def __init__(self, aClass): # On @ decoration

self.aClass = aClass

self.instance = None

def __call__(self, *args): # On instance creation

if self.instance == None:

self.instance = self.aClass(*args) # One instance per class

return self.instance

用例:

@singleton

class Test:

def __init__(self,**args):

self.a = args["a"]

self.b = args["b"]

def main():

t1 = Test(**{"a":1,"b":2})

print("a:",t1.a,"b:",t1.b)

t2 = Test()

print("a:",t2.a,"b:",t2.b)

output:

('a:', 1, 'b:', 2)

('a:', 1, 'b:', 2)

跟踪对象接口

def Tracer(aClass): # On @ decorator

class Wrapper:

def __init__(self, *args, **kargs): # On instance creation

self.fetches = 0

self.wrapped = aClass(*args, **kargs) # Use enclosing scope name

def __getattr__(self, attrname):

print('Trace: ' + attrname) # Catches all but own attrs

self.fetches += 1

return getattr(self.wrapped, attrname) # Delegate to wrapped obj

return Wrapper

用例:

@Tracer

class Spam: # Spam = Tracer(Spam)

def display(self): # Spam is rebound to Wrapper

print('Spam!' * 8)

@Tracer

class Person: # Person = Tracer(Person)

def __init__(self, name, hours, rate): # Wrapper remembers Person

self.name = name

self.hours = hours

self.rate = rate

def pay(self): # Accesses outside class traced

return self.hours * self.rate # In-method accesses not traced

food = Spam() # Triggers Wrapper()

food.display() # Triggers __getattr__

print([food.fetches])

bob = Person('Bob', 40, 50) # bob is really a Wrapper

print(bob.name) # Wrapper embeds a Person

print(bob.pay())

print('')

sue = Person('Sue', rate=100, hours=60) # sue is a different Wrapper

print(sue.name) # with a different Person

print(sue.pay())

print(bob.name) # bob has different state

print(bob.pay())

print([bob.fetches, sue.fetches]) # Wrapper attrs not traced

output:

Trace: display

Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

[1]

Trace: name

Bob

Trace: pay

2000

Trace: name

Sue

Trace: pay

6000

Trace: name

Bob

Trace: pay

2000

[4, 2]

管理函数和类

def register(label="",registerd = False):

def onRegister(func):

key = label if label else func.__name__

if registerd:

registerMap[key] = func

return func

return onRegister

用例:

@register(registerd=True)

def test1():

print("test1")

@register(label="modify")

def test2():

print("test2")

@register(label="test1",registerd=True)

def test3():

print("test3")

print getInstance("test1")

print getInstance("test2")

print getInstance("modify")

output:

ERROR:root:no attribute registered!

None

ERROR:root:no attribute registered!

None

验证函数参数

def rangetest(**argchecks):

def onDecorator(func):

code = func.__code__

allargs = code.co_varnames[:code.co_argcount]

funcname = func.__name__

def onCall(*pargs, **kargs):

positionals = list(allargs)

positionals = positionals[:len(pargs)]

for (argname, (low, high)) in argchecks.items():

# For all args to be checked

if argname in kargs:

# Was passed by name

if kargs[argname] < low or kargs[argname] > high:

errmsg = '{0} argument "{1}" not in {2}..{3}'

errmsg = errmsg.format(funcname, argname, low, high)

raise TypeError(errmsg)

elif argname in positionals:

# Was passed by position

position = positionals.index(argname)

if pargs[position] < low or pargs[position] > high:

errmsg = '{0} argument "{1}" not in {2}..{3}'

errmsg = errmsg.format(funcname, argname, low, high)

raise TypeError(errmsg)

else:

# Assume not passed: default

if True:

print('Argument "{0}" defaulted'.format(argname))

return func(*pargs, **kargs) # OK: run original call

return onCall

return onDecorator

用例:

class Person:

def __init__(self, name, job, pay):

self.job = job

self.pay = pay

# giveRaise = rangetest(...)(giveRaise)

@rangetest(percent=(0.0, 1.0)) # percent passed by name or position

def giveRaise(self, percent):

self.pay = int(self.pay * (1 + percent))

bob = Person('Bob Smith', 'dev', 100000)

sue = Person('Sue Jones', 'dev', 100000)

bob.giveRaise(.10)

sue.giveRaise(percent=.20)

print(bob.pay, sue.pay)

bob.giveRaise(1.10)

bob.giveRaise(percent=1.20)

# Test omitted defaults: skipped

output:

Argument "percent" defaulted

(100000, 120000)

Traceback (most recent call last):

File "d:/huyaowen/workspace/demo/rangetest.py", line 54, in

main()

File "d:/huyaowen/workspace/demo/rangetest.py", line 50, in main

bob.giveRaise(percent=1.20)

File "d:/huyaowen/workspace/demo/rangetest.py", line 18, in onCall

raise TypeError(errmsg)

TypeError: giveRaise argument "percent" not in 0.0..1.0

参数类型检测

def typetest(**argchecks):

def onDecorator(func):

code = func.__code__ # __code__ 返回已编译的函数对象

allargs = code.co_varnames[:code.co_argcount]

funcname = func.__name__

def onCall(*pargs, **kargs):

positionals = list(allargs)[:len(pargs)]

for (argname, expectedtype) in argchecks.items():

# 检测参数是否在关键字参数中

if argname in kargs:

if not isinstance(kargs[argname], expectedtype):

errmsg = '{0} argument "{1}" type is {2} ,not the expected type {3}'

errmsg = errmsg.format(funcname, argname, type(kargs[argname]), expectedtype)

raise TypeError(errmsg)

# 检测参数是否在位置参数中

elif argname in positionals:

position = positionals.index(argname)

if not isinstance(pargs[position], expectedtype):

errmsg = '{0} argument "{1}" type is {2} ,not the expected type {3}'

errmsg = errmsg.format(funcname, argname, type(pargs[position]), expectedtype)

raise TypeError(errmsg)

else:

pass

return func(*pargs, **kargs)

return onCall

return onDecorator

用例:

@typetest(a=int, c=float)

def func(a, b, c, d):

print(a,b,c,d)

func(1, 2, 3.0, 4) # Okay

func('spam', 2, 99, 4)

output:

(1, 2, 3.0, 4)

Traceback (most recent call last):

File "d:/huyaowen/workspace/demo/typetest.py", line 38, in

main()

File "d:/huyaowen/workspace/demo/typetest.py", line 35, in main

func('spam', 2, 99, 4)

File "d:/huyaowen/workspace/demo/typetest.py", line 22, in onCall

raise TypeError(errmsg)

TypeError: func argument "a" type is ,not the expected type

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

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

相关文章

php通过url传递变量,PHP:如何在模态URL中放置和传递变量

所以,我有一个按钮,可以在同一页面中直接链接到模态.这是按钮和网址href"main_user.php?user_id<?php echo $user[user_id]; ?>#myModal"class"btn btn-warning">(我尝试在#modal之前回显$user_id)是不是&#xff1f;单击按钮后,将出现模态.这…

python 根据类名 查找module_关于 Python 命令中的 m 参数

在命令行中使用 Python 时&#xff0c;它可以接收大约 20 个选项(option)&#xff0c;语法格式如下&#xff1a;python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]本文想要聊聊比较特殊的“-m”选项&#xff1a;关于它的典型用法、原理解析与发…

php xampp bug,PHP网站访问慢的处理方法

如果网站跑在了LAMP环境中&#xff0c;就无法使用php-fpm的slow log了&#xff0c;那如何分析瓶颈点&#xff1f;没关系你还可以使用这个XdebugWebgrind&#xff0c;其中Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具)&#xff0c;可以用来跟踪&#xff0c;调试和分析…

matlab安装程序无法启动jvm_JVM 执行 Java 程序时的内存区域划分

在学习 Java 虚拟机(后面简称&#xff1a; JVM )中的垃圾回收机制(GC)之前&#xff0c;先需要了解 在 JVM 中的 Java 程序(class 文件)加载到内存之后到底是怎么存的。在阅读了 JVM规范 和周志明的 《深入理解Java虚拟机(第2版)》 之后&#xff0c;总结一下JVM中的内存划分以及…

phpFpm加载php,php-fpm添加service服务的例子

nginx通过FastCGI运行PHP比Apache包含PHP环境有明显的优势,最近有消息称,PHP5.4将很有可能把PHP-FPM补丁包含在内核里,nginx服务器平台上运行PHP将更加轻松,下面我们就来看一篇php-fpm平滑启动并配置服务例子。我的php是源码安装的。php-fpm在PHP 5.3.2以后的版本不支持以前的p…

python 性能问题_Python 性能问题一直饱受诟病,这篇我们讨论下提升 Python 应用性能的常见方法。...

Python - 提高Python运行效率的六个窍门Python是一门优秀的语言&#xff0c;它能让你在短时间内通过极少量代码就能完成许多操作。不仅如此&#xff0c;它还轻松支持多任务处理&#xff0c;比如多进程。不喜欢Python的人经常会吐嘈Python运行太慢。但是&#xff0c;事实并非如此…

php中没有dockerfile,Dockerfile在RUN composer install命令中没有使用缓...

我以为我已经理解了Docker,但今天我发现了一些关于利用docker缓存的问题.这是我的dockerfileFROM quay.io/my_company/phpjenkinsWORKDIR /usr/src/my_projectADD composer.json composer.jsonADD composer.lock composer.lockRUN composer install -oADD . .RUN mkdir -p temp…

map循环遍历取值_Collection集合框架集和map

Collection集合框架集Java培训之Collection集合框架集MapMap概述Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap 中的 key 和 value 都可以是任何引用类型的数据Map 中的 key 不允许重复key 和 value 之间存在单向一对一关系&#xff0c;即通过指定的 key …

php查询字段前30个字符,php/json我的字段名被截断为30个字符。我能停下来吗?

好吧,我得到了一个供应商软件,他们说应该在ApachePHP服务器和MySQL数据库上运行。我没有这两个,所以我把它放在一个php-iis服务器上,并将代码转换为在SQL服务器上工作。前任。mysql_select_db->mssql_select_db(除其他外)所以我在一个PHP文件中有以下代码$query "SELE…

rserve php,使用Rserve远程执行R脚本

Rserve介绍Rserve是一个基于TCP/IP协议的&#xff0c;允许R语言与其他语言通信的C/S结构的程序&#xff0c;支持C/C,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接&#xff0c;认证&#xff0c;文件传输等功能。我们可以设计R做为后台服务&#xff0c;处理统计建模&…

搜索引擎提交软件_搜索引擎优化的发展史及SEO前景展望

SEO 是随着搜索引擎的普及而出现&#xff0c;并伴随搜索引擎的发展而发展的。关于搜索引擎和搜索引擎优化SEO 最初是怎么诞生的有很多种说法。有一个非常有趣的事实是&#xff0c;最早的一批SEO 甚至可以追溯到Yahoo 出现之前&#xff0c;我们可以把Yahoo 的传世人David Filo 和…

mongodb模糊查询_MongoDB的CRUD基本操作

原创&#xff1a;牛津小马哥Python后端工程师小李哥。在上周的推文中&#xff0c;我们介绍了MongoDB的数据库和集合的操作&#xff0c;现在&#xff0c;让我们来继续学习mongodb的另一个操作&#xff1a;CRUDCRUD操作&#xff1a;创建、读取、更新、删除文档。创建操作&#xf…

java有关问题,java经典有关问题!

java经典问题&#xff01;&#xff01;&#xff01;问题一&#xff1a;与equal的区别&#xff1f;和 equals 都是比较的,而前者是运算符,后者则是一个方法,基本数据类型和引用数据类型都可以使用运算符,而只有引用类型数据才可以使用 equals,下面具体介绍一下两者的用法以及区别…

python怎么创业_python创业

从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O&#xff0c;OLAP&#xff0c;Web开发&#xff0c;高性能网络通信&#xff0c;测试&#xff0c;爬虫等。Django:PythonWeb应用开发框架Django应该是最出名的Python框架&#xff0c;GAE甚至Erlang都有框架受…

python开发需要什么基础_零基础学习Python需要用什么开发工具?

对于学习Python的小伙伴&#xff0c;小编首推的Pycharm。首先&#xff0c;PyCharm用于一般IDE具备的功能&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制另外&#xff0c;PyCharm还提供了一些很好的功能用于Djan…

php send helo/ehlo first错误,phpmailer发送邮件提示SMTP server error怎么回事?

以下是我的代码错误提示信息为&#xff1a;SMTP server error: Error: send HELO/EHLO first如果把SMTPAuth改为true&#xff0c;错误为SMTP Error: Could not authenticate. Mail errorSMTP Error: Could not authenticate.请教大神是什么原因&#xff1f;是不是还需要哪些设置…

python elasticsearch_python elasticsearch模块使用

加载模块from elasticsearch import Elasticsearch连接ESes Elasticsearch(["172.30.6.12"])查询res es.search(index"test-index", body{"query":{"match_all":{}}})# 查询请求主机是ai.baidu.com 所有信息res es.search(index&qu…

php ci model条件查询,php – CodeIgniter中的多条件WHERE子句

我想删除一些像核心PHP中的查询这样的数据WHERE user_id$id AND sender_id$send_id OR user_id$send_id AND sender_id$id所以我在CodeIgniter中尝试使用Active Record,如下所示&#xff1a;$this->db->where(user_id ,$id);$this->db->or_where(user_id ,$send_id…

python语言打印菱形_Python 实现打印单词的菱形字符图案

Python 实现打印单词的菱形字符图案我就废话不多说了&#xff0c;还是直接看代码吧&#xff01;a [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]b [ * 2 * (7 - i) Good * i for i in a]for line in b:print(line)程序运行结果如下&#xff1a;补充知识&#xff1a;python打印菱…

java快捷键查看目录,java取得快捷方式指向的路径

当前位置:我的异常网 行业应用 java取得快捷方式指向的路径java取得快捷方式指向的路径www.myexceptions.net 网友分享于&#xff1a;2013-08-17 浏览&#xff1a;5次java获得快捷方式指向的路径import java.io.ByteArrayOutputStream;import java.io.File;import java.io.F…