python编码及工程规范

1、structuring of project

    首先我们需要去考虑如何更好地利用Python的特性来创造简洁、高效的代码。在C++/Java等工业界的语言中,“结构化”意味着通过编写简洁的代码,正如文件系统中文件和目录的组织一样,使代码的逻辑和依赖更清晰。

在任何项目开始之前我们需要做一个规划,例如哪个函数应该深入到哪个模块,数据在项目中应该如何流转,什么功能和函数应该组合或独立,最终看到的产品是怎样的等

2、structuring of repository

    在一个健康的开发周期中,代码风格,API设计和自动化都是非常关键的,如果目录结构是一团糟,没有清晰的结构,可能需要到处寻找才能找到所需要的内容或文档,为让每一位开发者能够熟悉它的每一个角落和细节,拥有良好的细节,良好的布局将会事半功倍

for example:README.rst
LICENSE-----------------------------在这个文件中要有完整的许可说明和授权。
setup.py-------------------------------  打包和发布管理
requirements.txt---------------------  它应该指明完整工程的所有依赖包: 测试, 编译和文档生成。
scanhosts/__init__.py--------------------------核心代码
scanhosts/views.py
dashboard/views.py
mydevops/settings.py---------------------配置文件
docs/index.rst------------------------参考文档
tests/test_basic.py----------------- 集合与单元测试,应该把测试例子放到模块里面,但这样会增加用户使用的复杂度;而且添加测试模块将导致需要额外的依赖和运行环境。
tests/test_advanced.py

manage.py-------------------------------------------- 常规管理脚本,即使不是C/C++写的项目也有makefile文件,make对于定义常规的管理任务是非常有用的工具

 

3、Django Applications

    不要错误的使用Django自带的应用模板创建项目,而导致目录结构非常糟糕

     通常:django admin.py startproject samplesite

       生成:

README.rst
mydevops/manage.py
mydevops/mydevops/settings.py
mydevops/mydevops/wsgi.py
mydevops/mydevops/scanhosts/models.py

       避免上述类似操作,因为相对路径使girrit工具等及开发者都容易误解,这种没有必要的嵌套对任何人都无益

    正确:django-admin.py startproject samplesite .

    生成:

README.rst
manage.py
samplesite/settings.py
samplesite/wsgi.py
samplesite/sampleapp/models.py

4、modules

    Python的modules是最主要的抽象层之一,抽象层允许将代码分成不同的部分,每个部分包含相关的数据与功能,在项目中,一层控制用户操作的相关接口,另一层处理底层数据的操作。最自然的分开这两层的方式是,在一层文件里重组所有的功能接口,并将所有底层操作封装到另一个文件中,这种情况下,接口文件需要导入封装底层操作的文件,可通过import和from import来完成。

    为遵守QJHK+J02009-2018+Python编程规范,规定模块名称要短、尽量使用小写,并避免使用特殊符号,例如.或?,scanhosts.db.py,该命名方式将会阻碍python的模块查找功能,python将认为需要在scanhosts文件夹中找到db.py,应尽量保持模块名称简单,无需分开单词,不要使用下滑线命名空间,而是使用子模块

# Good
import library.plugin.foo
# Bad
import library.foo_plugin

    除了以上的命名限制外,python文件成为模块没有其他特殊的要求,但为了合理的使用这个观念并避免问题,需要理解import的原理机制。Import module语句将寻找合适的文件,调用目录下的module.py,若没有找到,python解释器将递归的在pythonpath环境变量中查找文件,若仍没有找到,将抛出ImportError异常,一旦找到module.py,python解释器将在隔离的作用域中执行这个模块,所有顶层语句都会执行,包括其他的引用。方法与类的引用将会存储到模块的字典中,然后,这个模块的变量,方法和类通过命名空间暴漏给调用方,这是python中特别有用且核心的概念

5、packages

    Python提供非常简单的包管理系统,即简单地将模块管理机制扩展到一个目录上(目录扩 展为包)。

    任意包含 __init__.py 文件的目录都被认为是一个Python包

   

    一个常见的问题是往 __init__.py 中加了过多代码,随着项目的复杂度增长, 目录结构越来越深,子包和更深嵌套的子包可能会出现。在这种情况下,导入多层嵌套 的子包中的某个部件需要执行所有通过路径里碰到的 __init__.py 文件。如果 包内的模块和子包没有代码共享的需求,使用空白的 __init__.py 文件是正常 甚至好的做法。

6、code style

   我们提倡最明确和最直接的编码方式 

6.1、尽可能使用 is/is not 取代 ‘==’

6.2、使用基于类的异常

6.3、异常中不要裸露except、后面跟上具体的exception

6.4、异常中try代码尽可能少

6.5、python2中十进制浮点精度运算不准确,可使用decimal和fraction模块,例如价格校验

6.6、urlib2多线程访问会死锁,可使用urllib3模块

6.7、避免使用while true,避免死循环

6.8、函数if else不要多于3-4个,保持代码和逻辑清晰,复杂段落每个小的逻辑段落要有空行和注释

6.9、避免使用全局变量

6.10、复合语句因其简洁和表达性受到推崇,但不应同一行代码中写两条独立的语句。

 

7、Python 代码遵循 PEP 8 ,这也有助于在与其他开发人员 一起工作时使代码更加具有可持续性

7.1、检查变量是否等于常量

不需要明确的比较True或None,仅需放在if语句中(尽可能使用is/is not 取代 '==')

bad:

if attr == True:
    print 'True!'

if attr == None:
    print 'attr is None!'

Good:
if attr:
    print 'attr is truthy!'
if not attr:
    print 'attr is falsey!'
# or, since None is considered false, explicitly check for it
if attr is None:
    print 'attr is None!'

7.2、访问字典元素

不要使用 dict.has_key() 方法。取而代之,使用 x in d 语法,或者 将一个默认参数传递给 dict.get()

Bad:

d = {'hello': 'world'}
if d.has_key('hello'):
    print d['hello']    # 打印 'world'
else:
    print 'default_value'

 

Good:

d = {'hello': 'world'}

print d.get('hello', 'default_value') # 打印 'world'
print d.get('thingy', 'default_value') # 打印 'default_value'

# Or:
if 'hello' in d:
    print d['hello']

7.3:过滤列表:

在迭代列表的过程中,永远不要从列表中移除元素

# 过滤大于 4 的元素
a = [3, 4, 5]
for i in a:
    if i > 4:
        a.remove(i)

不要在列表中多次遍历

while i in a:
    a.remove(i)

 

7.4:在列表中修改值

bad:

赋值永远不会创建新对象。如果两个或多个变量引用相同的列表,则修改其中一个变量意味着将修改所有变量

# 所有的列表成员都加 3
a = [3, 4, 5]
b = a                     # a 和 b 都指向一个列表独享

for i in range(len(a)):
    a[i] += 3             # b[i] 也改变了

 

good:

创建一个新的列表对象并保留原始列表对象会更安全

a = [3, 4, 5]
b = a

# 给变量 "a" 赋值新的列表,而不改变 "b"
a = [i + 3 for i in a]
# 或者 (Python 2.x):
a = map(lambda i: i + 3, a)
# 或者 (Python 3.x):
a = list(map(lambda i: i + 3, a))

 

使用 enumerate() 获得列表中的当前位置的计数,

使用 enumerate() 函数比手动维护计数有更好的可读性。而且,它对迭代器 进行了更好的优化

a = [3, 4, 5]
for i, item in enumerate(a):
    print i, item
# 打印
# 0 3
# 1 4
# 2 5

 

读取文件:

使用with open语法来读取文件,它将会为您自动关闭文件

bad:

f = open('file.txt')
a = f.read()
print a
f.close()

 

Good:

with open('file.txt') as f:
    for line in f:
        print line

 

尽量使用with语句,即使是在 with 的区块中抛出异常,也能确保关闭文件。

 

8、Django工程注意规范

8.1.各个APP独立,做到项目的模块分明。 

    from mydevops.scanhosts.models import mycat

    该例子将项目名称加入其中是不合适,缺点在于:应用和项目变成了紧耦合,无法将应用轻易变得可重用。如果将来要换一个项目名称,那你可有得受了。

    推荐的做法是

     from scanhosts.models import mycat

8.2. 不要硬编码 MEDIA_ROOT,STATIS_ROOT, 

    在python中关于url的处理,有些原则,比如不要硬编码,处理成UNIX,WINDOWS兼容的格式,和进行空格的处理等

    MEDIA_ROOT = 'E:\\test\mugshot\\'

     STATIC_ROOT = '/VAR/TEMP/STATIC'

    这种做法有很多问题,比如机器迁移,和 应用的移动都会影响。

    SITE_ROOT = os.path.realpath(os.path.dirname(__file__)) 

     MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia') 

     TEMPLATE_DIRS = ( os.path.join(SITE_ROOT, 'templates'),)  

    这样的写法比较可扩展性。

8.3,不要将业务逻辑代码写到视图里

    虽然很多例子,它们把逻辑都写在了views.py里,因为这样不利于单元测试,不利于重用代码。

    那我们的业务逻辑应该放哪里呢?推荐放到模型里或者单独建立一个辅助模块。

    当然,获取数据列表的代码是可以放到视图里面的。

8.4,部署时别忘记将DEBUG设置成False

8.5、合理配置和使用URL

    不要将URL全都配置在一个urls.py文件中,比如:

    urlpatterns = [
    url(r'admin/', admin.site.urls),
    url(r'^getinfos$',user_history),
    url(r'^userinfos$',user_info),  
    url(r'^userauths$',user_auth),
    url(r'^usertemplates$',user_templates),
    url(r'listmycat',list_mycat),
    url(r'^add_mycat$',add_mycat),
    url(r'^add_mycat_monitor$',add_mycat_monitor),
    url(r'^search_datasource$',search_datasource),
    url(r'^create_dashboard$',create_dashboard),
    url(r'^mycat_delete/(?P<id>[0-9]+)/$',views.mycat_delete,name='mycat_delete')
    url(r'^addmycat',mycat_handler)
]

建议的方式是将各应用的URL配置在各自的urls.py中,这样可以使应用更容易重复使用到不同项目里:

urlpatterns = [
url(r'^admin/',admin.site.urls),
url(r'^xadmin/',xadmin.site.urls),
url(r'^DevOps/',include('scanhosts.urls',namespace='scanhosts')),
url(r'^DevOps/',include('grafahosts.urls',namespace='grafahosts')),
url(r'^DevOps/',include('dashboardhosts.urls',namespace='dashboardhosts'))
]

 

9、注释规范:

# status:success/failed
# data:object/string
# errmsg:错误返回的信息,可以直接弹出给用户


def mycat_del(request):
    """
 :param:vip
 :return: 删除成功,已删除mycat的信息
 """
 errmsg = None
 status = "failed"
 context = {
        "status": status,
        "errmsg": errmsg
    }
    if request.method == 'POST':
        vip = request.POST.get('vip').strip()
        if vip is not None:
            try:
                Mycat.objects.filter(vip=vip).update(deleted=0)
            except vip.DoseNotExist:
                context['errmsg'] = "Mycat %s does not exist." % vip
            else:
                context["status"] = "success"

 return JsonResponse(context)

优美胜于丑陋(Python以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)

 

原文地址:https://blog.csdn.net/u013009576/article/details/93467271

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Mycat是什么?MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一
转自:https://www.cnblogs.com/ivictor/p/5111495.html参考:https://www.cnblogs.com/damumu/p/7320258.htmlMyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署
1.在数据库做好主从同步的情况下搭建mycat。下载mycat,解压。修改server.xml文件,修改schema.xml待完善启动mycat。参考文章:https://blog.csdn.net/yelllowcong/article/details/79063546https://www.cnblogs.com/NingKangMing/p/6143834.html
集群的服务器列表在10.11.0.210和10.11.0.216中部署mycat和haproxy(因为实验机器性能有限,实际生产环境中需要单独用服务做haproxy反向代理) 两台机器的Mycat配置和haproxy保持一致即haproxyàmycatàpxc集群àmysql分片 Mycat的相关配置Server.xml[root@node6
Mycat是什么?·一个彻底开源的,面向企业应用开发的大数据库集群·支持事务、ACID、可以替代MySQL的加强版数据库·一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群·一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQLServer·结合传统数据库和新型分布式数
<system>配置Mycat系统参数 <system>  <propertyname="serverPort">3306</property><!--mycat服务端口-->  <propertyname="managerPort">9066</property><!--mycat管理端口-->  <propertyname=&q
数据库中间件:mycat逻辑库:即mycat服务上的数据库,并非实际mysql服务上的数据库。逻辑表:与逻辑库同理。数据节点:是mycat逻辑表与mysql物理表的对应关系,mycat服务上某个库中的某个表的数据可能是由不同mysql服务器上数据库中表的数据组成。具体哪个逻辑表对应mysql的哪个实际
MyCat的官方网站:http://www.mycat.org.cn/下载地址:https://github.com/MyCATApache/Mycat-download第一步:下载wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 并解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
show@@sql;Emptyset(0.01sec)一直查不出数据查看在Mycat中执行过的SQL语句,需要确认server.xml配置文件中的<propertyname="useSqlStat">1</property>刚开始一直出不来数据,最后发现是没开启的原因。。。。。。1. 连接mycat9066管理端口   mysql-h127.0.0.1-
Mysql分布式集群部署mycat分库分表系列(共三套)系列一:《分布式集群+分库分表实战教程》本套课程将通过分布式集群和分库分表两部分内容进行讲解1、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务
1、下载系统安装包选择相应的版本进行下载,地址:http://dl.mycat.io/ 。Mycat数据库分库分表中间件介绍 http://www.mycat.io/2、安装安装mycat前需要保证系统已安装过jdk和mysql,将下载好的mycat安装包解压到某个目录下,然后进入mycat解压目录下的bin目录(打开cmd控制台确保是以管
原文:学会数据库读写分离、分表分库https://www.cnblogs.com/joylee/p/7513038.html系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。这篇文章主要是MyCAT的入门部署。  随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应
MyCat安装配置学习1.下载安装tar解压(不多说)2.MyCat命令./mycatstart启动./mycatstop停止./mycatrestart重启配置server.xml添加用户设置配置schema.xml
1.Mycat入门官网http://www.mycat.io/1.1.什么是Mycat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL
因为51博客写作格式问题,以后文档都以有道文档连接为主,已整理到有道云笔记,目前笔记有云计算运维大数据运维,应用运维,DBA,测试,小白想学的可以加我qq:936172842,,请注明51学友,无备注一律不加,http:/ote.youdao.comoteshare?id=935db6cec339054c82d8b3f6ac343fa0⊂=DBB78851CCCF486EB26B
MyCat简介前面文章我们提到,如果数据量比较大的话,我们需要对数据进行分库分表,分完之后,原本存在一个数据库中的数据,现在就存在多个数据库中了,就像下面这样:  那么此时MyCat所扮演的角色就是分布式数据库中间件!MyCat是一个开源的分布式数据库中间件,它实现了MySQL协议,在开发
一、自定义类加载器在复杂类情况下的运行分析1、使用之前创建的类加载器publicclassMyTest16extendsClassLoader{privateStringclassName;//目录privateStringpath;privatefinalStringfileExtension=".class";publicMyTest16(Stringclass
mycat是一个中间层mycat不存储任何数据,所有数据存储在mysql中mycat对于开发人员来说就是mysql,但mycat不能支持所有mysql语句mycat可以实现对后端数据库的分库分表和读写分离、负载均衡mycat对前端应用隐藏了后端数据库的存储逻辑(比如对后端数据读写分离,如果在程序中实现,则每一个使
下载:https://github.com/MyCATApache/Mycat-download安装:直接解压运行命令:linux:   ./mycatstart启动   ./mycatstop停止   ./mycatconsole前台运行   ./mycatrestart重启服务   ./mycatpause暂停   ./mycatstatus查看启动状态windows: