有参装饰器,迭代器
作业:
1、编写课上讲解的有参装饰器准备明天默写
def outter2(mode):
def outter1(func):
def wrapper(*args,**kwargs):
inp_name=input('your name==>').strip()
inp_pwd=input('your pwd==>').strip()
if mode == 'file':
print('认证来源==>file')
with open('user.txt','rt',encoding='utf-8')as f:
for line in f:
name,pwd=line.strip().split(":")
if inp_name == name and inp_pwd == pwd:
print('login_successful')
res = func(*args,**kwargs)
return res
else:
print('name or pwd error')
elif mode == 'ldap':
print('认证来源==>ldap')
elif mode == 'mysql':
print('认证来源==>mysql')
else:
print('未知的认证来源')
return wrapper
return outter1
@outter2('file')
def index(x,y):
print('index==>',x,y)
index(1,2)
2:还记得我们用函数对象的概念,制作一个函数字典取代多分支if的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
dic = {}
def outter(func):
def wrapper(*args,**kwargs):
dic['name']=func
res = func(*args,**kwargs)
print(dic)
return res
return wrapper
@outter
def login():
print('登录功能===>')
login()
@outter
def register():
print('注册功能===>')
register()
@outter
def transfer(user1,user2,money):
print('转账功能===>')
transfer('ceshi1','ceshi2',1000)
3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定=》有参装饰器
注意:时间格式的获取
import time
time.strftime(’%Y-%m-%d %X’)
import time
def outter2(path):
def outter1(func):
def wrapper(*args,**kwargs):
with open(path,'at',encoding='utf-8')as f:
f.write('%s:%s run\n'% (time.strftime('%Y-%m-%d %H:%M:%S'),func.__name__))
res = func(*args,**kwargs)
return res
return wrapper
return outter1
@outter2('access.log')
def index(x,y):
print('index===>',x,y)
index(1,2)
4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
str = 'hello'
l = [111,222,333]
t = (1111,2222,3333,4444,5555)
d = {'k1':111,'k2':222,'k3':333}
set = {'a','b','c'}
def wrapper(x):
while True:
try:
print(next(x))
except StopIteration:
break
wrapper(iter(str))
wrapper(iter(l))
wrapper(iter(t))
wrapper(iter(d))
wrapper(iter(set))
wrapper(iter_f)
def wrapper(path):
with open(path,'rt',encoding='utf-8')as f:
iter_f=iter(f)
while True:
try:
print(next(iter_f))
except StopIteration:
break
wrapper('user.txt')