*****装饰器下****
***inspect模块***
<inspect.getcallargs返回一个字典, key值为:形参, value值为对应的实参>
import functools
import inspect
def is_admin(fun): # fun=add_student
@functools.wraps(fun)
def wrapper(*args, **kwargs): # kwargs = {'name':'root'}
inspect_res = inspect.getcallargs(fun, *args, **kwargs)
print("inspect的返回值: %s" %(inspect_res))
if inspect_res.get('name') == 'root':
temp = fun(*args, **kwargs)
return temp
else:
print("not root/admin user, no permisson add student") # 抛出异常
return wrapper
@is_admin # add_student = is_admin(add_student)
def add_student(name): #
print("添加学生信息.....")
add_student('redhat')
***多个装饰器***
<装饰规则:从下至上调用,从上至下装饰>
def decorator_a(func):
print('Get in decorator_a')
def inner_a(*args, **kwargs):
print('Get in inner_a')
return func(*args, **kwargs)
return inner_a
def decorator_b(func):
print('Get in decorator_b')
def inner_b(*args, **kwargs):
print('Get in inner_b')
return func(*args, **kwargs)
return inner_b
# 当有多个装饰器时, 从下到上调用装饰器;
@decorator_b # f = decorator_b(inner_a) # f = inner_b
@decorator_a # f = decorator_a(f) # f = inner_a
def f(x):
print('Get in f')
return x * 2
f(1)
***带参数的装饰器***
import functools
import time
import random
def addLog(type): # type='warn'
# type="warn" Warn
# type.title()
def add_log(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
start_time = time.time()
res = f(*args, **kwargs)
end_time = time.time()
print("日志信息:[%s] [%s] %s 运行时间为%.5f s 运行结果为%s" %(
type.title(),time.ctime(),f.__name__,end_time-start_time,res))
return res
return wrapper
return add_log
@addLog("warn") # hello = addLog(warn')
# hello = add_log(hello)
# hello ======= wrapper()
def hello():
time.sleep(random.random())
return "hello"
@addLog(type="debug")
def add(x,y):
time.sleep(random.random())
return x+y
print(hello())
print(add(1,2))
****模块与包****
***模块分类***
# - 内置模块 : random,sys,time,collections, functools, inspect
# - 自定义模块: 自己写的模块;
# - 第三方模块: pypi.python.org; itchat,qrcode
***写模块***
import sys
def test():
args = sys.argv
if len(args) == 1:
print 'Hello world'
elif len(args) == 2:
print 'Hello %s!' %args[1]
else:
print 'Too many arguments!'
if __name__ == '__main__':
test()
***模块调用***
> 当我们调用一个模块时,Python 会在指定的路径下搜索对应
的.py 文件;
> 默认情况下,Python 解释器会搜索当前目录、所有已安装的内置模
块和第三方模块,搜索路径存放在 sys 模块的 path 变量中;
>> 添加路径到默认搜索路径中;
# sys.path.append('xxx')
# sys.path.insert(0,'xxx')
***包***
包的创建:
创建一目录为包名;
在该文件夹下创建__init__.py文件存放包的信息,该文件
可以为空;
根据需要存放脚本文件,已编译的扩展及子包;
可以用import,import as,from import等语句导入模块
和包;
****文件操作****
***打开文件***
>>f=open('file') 默认已读的方式打开 结束要以f.close() 关闭文件
>>with语句 结束文件操作自行关闭
打开模式:
>>'r' *只读 不可写 *不可创建新文件 *指针默认在开始
>>'r+' *可读可写 *打开时不会清空文件内容 *不可创建新文件 *指针默认在开始
>>'w' *只写 不可读 *打开时清空文件内容 *可以创建新文件 *指针默认在开始
>>'w+' *可读可写 *打开时清空文件内容 *可以创建新文件 *指针默认在开始
>>'a' *只写不可读 *打开时不会清空文件内容 *可以创建新文件 *指针默认在结尾
>>'a+' *可读可读 *打开时不会清空文件内容 *可以创建新文件 *指针默认在结尾
***文件的读写***
读:#f.read() 读取文件所有内容 <加参数时读取相应字节>
#f.readline() 读取一行内容 <加参数时读取相应行内容>
#f.readlines() 读取文件所有内容 ,返回一个列表
#for 循环遍历
f = open("/root/Desktop/xxx")
print(f.read())
f.seek(0,0)
print('=============')
print(f.readline())
print(f.readline())
print(f.readline())
f.seek(0,0)
print('=============')
print(f.readlines())
写:#f.write() 写入内容
#f.writelines() 写入多个内容
f = open("/root/Desktop/xxx", 'a+')
li = ['user1', 'user2', 'user3']
f.write("hello")
f.writelines(['gcc\n', 'c++\n'])
f.writelines([line+"\n" for line in li])
f.seek(0,0)
print(f.read())
f.close()
注:读文件和写文件都会使指针移动
#f.seek(x,x)移动指针
#f.tell()指针位置
***os模块文件名的操作***
import os
print(os.getcwd())#显示当前路径
print(os.path.splitext('hello.py'))#分离文件名和后缀
print(os.path.split('/home/aa/hello.py'))#分离路径和文件名
print(os.listdir('/var/log'))#显示该目录下所有内容
os.mknod('/tmp/westos')#创建文件
os.remove('/tmp/westos')#删除文件
os.mkdir('/tmp/westosdir')#创建目录
os.makedirs('/tmp/ok/westosdir')#创建多重目录
os.removedirs('/tmp/ok/westosdir')#删除目录
print(os.path.isfile("/etc/passwd"))#判断对象是否为文件
print(os.path.isabs("~/passwd"))#判断对象是否为绝对路径
print(os.path.exists('/etc/passwds'))#判断对象是否存在
print(os.path.exists('/mnt'))
print(os.path.sep) #linex:/ windows:\
print(os.path.basename('/hello/hello.py'))#提取文件名
print(os.path.dirname('/hello/hello.py'))#提取目录
os.rename('/tmp/passwdok', '/mnt/passwdok')#重命名
文件操作练习:
# 题目:
# 创建文件/mnt/hello{1..8}.jpg /mnt/westos{a..d}.py
# 修改所有的.jpg结尾的文件为/mnt/hello{1..8}.png;
#创建文件
import os
def creatfile(dirname):
filea = ['hello' + str(i) + '.jpg' for i in range(1, 9)]
fileb = ['westos' + str(i) + '.py' for i in range(1, 9)]
for file in filea+fileb:
filename=dirname+file
if not os.path.exists(filename):
os.mknod(filename)
print('%s文件创建成功'%filename)
else:
print('%s文件创建失败'%filename)
#修改文件名
creatfile('/root/Desktop/')
def mod_filename(dirname,oldsuffix,newsuffix):
if '.' not in oldsuffix:
oldsuffix='.'+oldsuffix
if '.' not in newsuffix:
newsuffix='.'+newsuffix
if os.path.exists(dirname):
olddict=[filename for filename in os.listdir(dirname) if filename.endswith(oldsuffix)]
basename=[os.path.splitext(filename)[0] for filename in olddict]
for filename in basename:
dirname=os.path.abspath(dirname)+os.path.sep#找绝对路径
old_name=dirname+filename+oldsuffix
new_name=dirname+filename+newsuffix
os.rename(old_name,new_name)
print('%s重命名%s成功'%(old_name,new_name))
else:
print('%s目录不存在'%dirname)
mod_filename('/root/Desktop/','.py','.c')
print (os.listdir('/root/Desktop/'))
*********THE END*********