python高级编程之选择好名称:命名指南
# # -*- coding: utf-8 -*-
# # python:2.x
# __author__ = 'Administrator'
#命名指南
#一组常用的命名规则可以被应用到变量,方法函数和属性上,类和模块的名称在命名空间叫是扮演重要角色的,所以一般有2个模式:觉模式和反模式
#使用has,is前缀命名布尔元素,例如
#当一个元素用来保存布尔值,使用has,is前缀命名布尔元素是一个很好的选择
class DB(object):
is_connected=False
has_cache=False
has_1=DB()
print has_1.has_cache
#复数形式命名序列元素
#当一个元素是用来保存一个序列,使用复数形式命名是个好主意,对一些以类似序列的形式输出映射而言,也是可以的
class DN(object):
connected_user=['tarek']
tables={'cutomer':['id','frm','lat']}
#用显式全称命名字典
#当一个变量用来保存一个映射时,应该尽可能使用显式名称
perespod_addre={'appl','65556'}
#避免通用名称
#当在代码中不构建一个新的抽象数据类型,如list,dict,sequence等这样的名称是有害的,即使对于局部变量也一样,如下
def comput(data):
for element in data:
yield element*12
def disup_num(num):
for num1 in num:
pass
#避免现有名称,当上下文中名称已经有了是一种坏习惯,会在调试时产生很多混乱
def bad_ct():
os=1
import pdb
pdb.set_trace()
return os+2
#在这个例子中,os名称将被代码遮蔽,内建来自标准程序库模块名都应该被避免,
#尝试创建独特名称,即使它们是上下文的局部变量,对于关键字而言,添加一个后缀下划线避免冲突一种方法,如下
def x(tree,or_=True):
pass
#class 经常被改成klass或者cls,如下
def funct(klass,*a,**ki):
return klass(*a,**ki)
#________
#参数最佳实践
#根据3个简单规则来说明前面的内容
"""
根据迭代设计构建参数
信任参数和测试
小心使用魔法参数*args和**kw
"""
#根据迭代设计构建参数
#当每个函数都有一个固定的,精心设计参数列表,会变的健壮,但是这在第一个版本中不能完成,所以根据迭代设计构建参数,它们应该反映创建该元素所针对使用场景,并且相应地进行演化,如下
#当附加一些参数时,应该尽可能有默认值以避免任何退化
class BD(object):
def _q(self,q1,q2):
print '_q(2个参数)'
def execute(self,q1):
self._q(q1,'execute')
BD().execute('my query')
import logging
class BD(object):
def _q(self,query,types,logger):
logger('song')
def execute(self,a,loggeg=logging.info):
self._q(a,'execute',logging)
#当一个公共元素的参数必须变化时,将使用一个deprecation进程,后面讲解
#信任参数和测试
#基于python动态类型特性考虑。有些开发人员在函数和方法善使用断言来确定有正确内容,如下:
def division(d,d1):
assert type(d) in (long,int,float)
assert type(d1) in (long,int,float)
return d/d1
#这通常是那些习惯于动态类型并且感觉python中缺少点什么开发人员
#这种检查参数的方法是契约式设计编程风格(design by contract:http://en.wikipedia.org/wiki/design_by_contract)一部分,在这样的设计中,代码在实际运行之前会先检查断言
#主要2个问题
"""
1:dbc代码解释它应该如何使用,导致程序易读性降低
2:可能使代码执行速度变得更慢,因为每次调用都要进行断言
"""
"""
2可以通过执行解释程序时加上-O选项来避免,在这种情况下,所有断言都商贸城 字节码被创建之前从代码中删除,这样检查也就会丢失
在任何情况下,断言都必须小心进行,并且不应该导致python变成一种静态类型语言,唯一使用场景就是保护代码不被无意义的调用.
一个健康的测试驱动开发风格在大部分情况下将提供健壮的基础代码,在这里,功能和单元测试验证了所有创建代码所针对的使用场景
当程序库中的代码被外部元素使用时,建立断言可能是有用的,因为输入数据可能会导致程序结束甚至造成破坏,这在处理数据库或者文件系统代码中是很可能发生的。
另一种庐江是:模糊测试(fuzz testing:en.wikipedia.org/wiki/fuzz_testing),它通过向程序发送随机数据块以检测其弱点,当发现一个新的缺陷时,代码可以相应地被修复,并加上一次新的测试
让我们来关注一个遵循TDD方法,向正确的方向演变并且每当新的缺陷出现时进行调整,从而使健壮性越来越好的代码,当它以正确的方式完成时,测试中的断言列表在程度上变得和预言列表相似
DBC程库,可以在contracts for python(www.wayforward.net/pycontract/)中找到
"""
#小心使用*a,**k魔法参数可能会破坏函数或者方法的健壮性,会使用签名变得模糊,而且代码常常开始不在出现的地方构建小的参数解析器,如下
def f(**k):
if 'd'in k:
print 'ok1'
else:
print 'ok2'
print 'f(**k)是一个字典'
#当参数列表很长而且很复杂时,那么添加魔法参数是很有诱惑力的,但这通常意味着,它是一个脆弱的函数或者方法,应该被分解或者重构
#当*a被用来处理一系列在函数中以同样方式处理的元素时,要求传入比如iterator之类的唯一容器参数会更好,如下
def s(*a1):#可行
t1=0
for a in a1:
t1+=a
return t1
def s(a1):#更好
t1=0
for a in a1:
t1+=a
return t1
#对于**k而言,和8a一样的规则,这样会让方法签名更有意义
def kw(**kw):#可行
n=kw.get('a','b')
return '%s'%(n)
def kw(a='a',b='b',c='c'):
return a,b,c
#另一种有趣的庐江是创建一个聚焦多个相关参数以提供执行环境容器类,这种结构与8a,**k不同,因为它可以提供工作于数值之上并且能够独立深化内部构件,将它当作参数来使用代码将不必处理其内部构建
#web例子
def log1(reque):#版本1
return reque.get('http','no url')
def log2(re1):#版本2
print re1.get('http','no url1')
print re1.get('http','no url1')
#魔法参数有时候是无法避免的,特别是在元编程时,总的来说,当涉及仅仅位于函数中未知数据时,魔法参数很擅长,如下:
def log(**conte):
logging.info(str(conte))
#类名:必须简明,精确,并足以从中心理解类所完成的工作,常见的一个方法是使用表示其类型或者特性后缀,如:
"""
SQLEngine
MimeTypes
StringWidget
TestCase
"""
#对于基类而言,可以使用一个Base或者Abstract前缀,如下
"""
BaseCookie
AbstractFormatter
"""
#最重要的是要和类特性保持五毒,如:
#SMTP.smtp_send() 命名空间中存在冗余信息
#SMTP.send() 可读性更强,也更易于记忆
#模块和名名称
#在模块和名名称中,应该体现出内容用途,这些名称应简短,使用小写字母,不使用下划线,如下
"""
sqlite
postgres
shal
"""
#如果它们实现一个协议,那么通常会使用lib前缀,如下
import smtplib,urllib,telnetlib
#它们在命名空间中也必须保持一致,这样使用起来会更简单,如下
#from widgets.stringwidgets import TextWidget 不好的
#from widgets.strings import TextWidget 好的
#同样,应该始终避免使用与来自标准程序库模块相同名称
#当一个模块变得比较复杂,包含很多类时,创建一个包并将模块元素分到其他模块中是一个好习惯
#__init__模块也可以用来将一些API放回最高级别中,因为它不会影响这些API使用,而且帮助将代码组织为更小的部分,比如foo包中一个模块,如下
#from module1 import f1,f2
#from mudule2 import f3
#允许用户直接导入功能,如下
# from foo import f1
# from foo import f2,f3
# 但是要意识到,这可能会增加循环依赖可能性,__init__模块中添加代码将被实例化,所以要小心使用.
python高级编程之选择好名称:命名指南的更多相关文章
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程之选择好名称:pepe8和命名最佳实践
# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...
- python高级编程之选择好名称:完2
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #分解代码 #小就是美,这也适用所有级别的代码,当一个函数,类或者一 ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
随机推荐
- text-overflow简单使用
text-overflow属性配合overflow才有效果,还记得把文字强制一行显示,如下代码: <!DOCTYPE html> <html lang="zh-cn&quo ...
- XSS完全解决方案
xss 为什么不能阻止用户输入不安全数据 比如用户想发一篇标题的文章 1+1>2吗? 为什么不在数据库存的时候就处理好或者接口里处理好 1<2 会被转义为 1<2,放到html中确实 ...
- Wikioi 1080一维树状数组
半个月时间最终把那些杂七杂八的学完了,尽管学完也,也仅仅是有了个模板,自己手敲还是不太行.所以如今開始要疯狂刷题了! ! .!!! 这题裸的树状数组.曾经写那道<敌兵布阵>的时候写过,所以 ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- 随着时间的推移:构造SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)
在进行Android应用的开发过程中,有时候在配置SDK路径的时候(Windows->Preferences->Android).会出现例如以下报错:An error occurred w ...
- asp.net实现将网页存为mht格式文件,类似于网页另存为mht功能
MHT 首先说一下什么是mht格式文件,MHT叫“web单一文件”,就是把网页中包含的图片,CSS文件以及HTML文件全部放到一个MHT文件里面,而且浏览器可以直接读取显示.可以通过ie浏览器将一个网 ...
- 先装Net Framework 后 装 IIS的处理办法
先装IIS话,后面装Net Framework时候会自动注册 处理aspx和ashx等的处理扩展程序 先装Net Framework 后 装 IIS.扩展程序注册在命令:aspnet_regiis - ...
- 调试EF源码
在解决方案中添加下载好的EF的源码的引用 在新建项目中添加程序集的引用 添加配置文件中的节点 测试 获取程序集的公钥标记: 使用sn.exe命令 使用reflector
- 如何禁用不需要的HTTP方法
IIS7.0默认开启了不安全的OPTIONS和TRACE方法,建议关闭这两个方法. 以下环境为windows server 2008.IIS7.0 方法(1):web.config 在<conf ...
- .NET中应用Ueditor(富文本编辑)的配置和使用
一.Ueditor的下载 1.百度编辑器下载地址:http://ueditor.baidu.com/website/download.html 2.下载完整源码包,解压到任意目录,解压后的源码目录结构 ...