1、装饰器。
now = log(now)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import functools def log(func): @functools.wraps(func) def wrapper(*args, **kwargs): print('{0} is running'.format(func.__name__)) print("args ---> ", *args) print("kwargs ---> ", kwargs) func(*args, **kwargs) print("after") return wrapper @log def request(a, b, **kwargs): print(a, b, kwargs['city']) if __name__ == '__main__': request(1, 2111, city="name", vimi="vimi")
需要带参数的装饰器,相当于 now = log('ages')(now)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import functools def log(requierd = False): def wrapper(func): @functools.wraps(func) def wrapper_func(*args, **kwargs): print('{0} is running'.format(func.__name__)) if (requierd): func(*args, **kwargs) print("after") return wrapper_func return wrapper @log(requierd = True) @log(requierd = False) def request(a, b): print(a, b) if __name__ == '__main__': request(1, 2111) # request is running # request is running # after # after
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import functools def log(requierd = False): def wrapper(func): @functools.wraps(func) def wrapper_func(*args, **kwargs): print('{0} is running'.format(func.__name__)) if (requierd): func(*args, **kwargs) print("after") return wrapper_func return wrapper @log(requierd = False) @log(requierd = True) def request(a, b): print(a, b) if __name__ == '__main__': request(1, 2111) # request is running # after
完整版decorator:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from flask import g, session, make_response, request import functools from logger.logger import log from errors.expection import ArgsError """ load user from cookies """ def parse_user(): def decorator(func): @functools.wraps(func) def wrapper_func(*args, **kwargs): user_id = session.get('user_id') if user_id: g.user_id = user_id else: raise ArgsError('Require login') return func(*args, **kwargs) return wrapper_func return decorator """ set Access-Control-Allow """ def parse_access(allow_origin = "*", allow_methods = "PUT,GET,POST,DELETE,OPTIONS", allow_headers = "Referer,Accept,Origin,User-Agent,Content-Type"): def decorator(func): @functools.wraps(func) def wrapper_func(*args, **kwargs): resp = make_response(func(*args, **kwargs)) resp.headers['Access-Control-Allow-Origin'] = request.headers.get('Origin') resp.headers['Access-Control-Allow-Methods'] = allow_methods resp.headers['Access-Control-Allow-Headers'] = allow_headers resp.headers['Access-Control-Allow-Credentials'] = "true" # allow send cookies return resp return wrapper_func return decorator """ parse args from request """ def parse_args(args_name=[]): def decorator(func): @functools.wraps(func) def wrapper_func(*args, **kwargs): g.args = {} for value in args_name: if request.form.get(value) and request.args.get(value): raise ArgsError('Require diff args name from post and get, args: {}'.format(value)) g.args[value] = request.args.get(value) or request.form.get(value) if not g.args[value]: raise ArgsError('Require args {}'.format(value)) return func(*args, **kwargs) return wrapper_func return decorator
logging:
2、*args 和 **kwargs
*args就是用来传入可变参数的,转化为一个list或者一个tuple,所以如果一个函数是 def calc(*args)
可以这样调用 calc(1, 2, 3),就会帮你自动转化为一个list。。如果你本身就是一个list,需要 calc(*list)
**kwargs就是一个关键字参数,他就是一个dict,所以如果一个函数是def calc(**kwargs)
你可以这样调用,calc(city="guangzhou", name="vimi"),如果本身是一个dict,需要calc(**dict)
3、python中的is比较的是id(也就是地址),== 比较的是value。
4、python中的ORM sqlalchemy
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from sqlalchemy import create_engine,Table,Column,Integer,String,MetaData,ForeignKey engine=create_engine("mysql+pymysql://root:vimi@127.0.0.1:3305/homework",echo=True) metadata=MetaData(engine) address_table = Table('user', metadata, Column('id', Integer, primary_key=True), Column('name', String(128)), ) metadata.create_all()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine, Integer #导入包 from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建对象的基类: Base = declarative_base() #定义一个类 class User(Base):# 表的名字: __tablename__ = 'user'# 表的结构: id = Column(Integer, primary_key=True) name = Column(String(20)) # 初始化数据库连接: engine=create_engine("mysql+pymysql://root:vimi@127.0.0.1:3305/homework",echo=True) # 创建DBSession类型: DBSession = sessionmaker(bind=engine) # 创建表 Base.metadata.create_all(engine)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine #导入包 from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建对象的基类: Base = declarative_base() #定义一个类 class User(Base):# 表的名字: __tablename__ = 'user'# 表的结构: id = Column(String(20), primary_key=True) name = Column(String(20)) # 初始化数据库连接: engine=create_engine("mysql+pymysql://root:vimi@127.0.0.1:3305/homework",echo=True) # 创建DBSession类型: DBSession = sessionmaker(bind=engine) # 创建session对象: session = DBSession() # 创建新User对象: new_user = User(id='5', name='Bob') # 添加到session: session.add(new_user) # 提交即保存到数据库: session.commit() # 关闭session: session.close()
5、python中的jsonify的作用是可以加缩进啊,加content/type之类的。
6、lambda x, y, z : x + 1