﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-不过而而-随笔分类-Python</title><link>http://www.blogjava.net/lincode/category/35958.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 03 Feb 2011 04:46:49 GMT</lastBuildDate><pubDate>Thu, 03 Feb 2011 04:46:49 GMT</pubDate><ttl>60</ttl><item><title>Python 代码风格 和 PEP8</title><link>http://www.blogjava.net/lincode/archive/2011/02/02/343859.html</link><dc:creator>lincode</dc:creator><author>lincode</author><pubDate>Tue, 01 Feb 2011 16:45:00 GMT</pubDate><guid>http://www.blogjava.net/lincode/archive/2011/02/02/343859.html</guid><wfw:comment>http://www.blogjava.net/lincode/comments/343859.html</wfw:comment><comments>http://www.blogjava.net/lincode/archive/2011/02/02/343859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lincode/comments/commentRss/343859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lincode/services/trackbacks/343859.html</trackback:ping><description><![CDATA[Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下，不同程序员编写的 Python 代码可以保持最大程度的相似风格。这样就易于阅读，易于在程序员之间交流。<br />
<br />
<br />
<strong><span style="font-size: 18pt"><strong>1 变量</strong></span><br />
</strong><br />
<strong>常量</strong> : 大写加下划线<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">USER_CONSTANT</span></div>
对于不会发生改变的全局变量，使用大写加下划线。<br />
<strong><br />
私有变量</strong> : 小写和一个前导下划线<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">_private_value</span></div>
Python 中不存在私有变量一说，若是遇到需要保护的变量，使用小写和一个前导下划线。但这只是程序员之间的一个约定，用于警告说明这是一个私有变量，外部类不要去访问它。但实际上，外部类还是可以访问到这个变量。<br />
<br />
<strong>内置变量</strong> : 小写，两个前导下划线和两个后置下划线<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #800080">__class__</span></div>
两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。<br />
<br />
<br />
<strong><span style="font-size: 18pt"><strong>2&nbsp;函数和方法<br />
</strong></span></strong><br />
总体而言应该使用，小写和下划线。但有些比较老的库使用的是混合大小写，即首单词小写，之后每个单词第一个字母大写，其余小写。但现在，小写和下划线已成为规范。<br />
<br />
<strong>私有方法</strong> ： 小写和一个前导下划线<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;_secrete(self):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">don't&nbsp;test&nbsp;me.</span><span style="color: #800000">"</span></div>
<p>这里和私有变量一样，并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时，Python 的名称改编特性将发挥作用)。特殊函数后面会提及。<br />
<br />
<strong>特殊方法</strong> ： 小写和两个前导下划线，两个后置下划线</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">__add__</span><span style="color: #000000">(self,&nbsp;other):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;int.</span><span style="color: #800080">__add__</span><span style="color: #000000">(other)</span></div>
<p>这种风格只应用于特殊函数，比如操作符重载等。<br />
<br />
<strong>函数参数</strong> : 小写和下划线，缺省值等号两边无空格</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;connect(self,&nbsp;user</span><span style="color: #000000">=</span><span style="color: #000000">None):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;self._user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;user</span></div>
<p><br />
<br />
<span style="font-size: 18pt"><strong>3 类</strong></span></p>
<p>类总是使用驼峰格式命名，即所有单词首字母大写其余字母小写。类名应该简明，精确，并足以从中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀，例如:<br />
SQLEngine<br />
MimeTypes<br />
<br />
对于基类而言，可以使用一个 Base 或者 Abstract 前缀<br />
BaseCookie<br />
AbstractGroup<br />
</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UserProfile(object):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">__init__</span><span style="color: #000000">(self,&nbsp;profile):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;self._profile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;profile<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;profile(self):<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;self._profile</span></div>
<p><br />
<br />
<strong style="font-size: 18pt">4 模块和包</strong></p>
<p>除特殊模块 __init__ 之外，模块名称都使用不带下划线的小写字母。<br />
若是它们实现一个协议，那么通常使用lib为后缀，例如:<br />
import smtplib<br />
</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;os<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;sys</span></div>
<p><br />
<br />
<strong style="font-size: 18pt">5&nbsp;关于参数<br />
</strong><br />
5.1 不要用断言来实现静态类型检测<br />
断言可以用于检查参数，但不应仅仅是进行静态类型检测。 Python 是动态类型语言，静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。<br />
<br />
5.2 不要滥用 *args 和 **kwargs<br />
*args 和 **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊，而且代码常常开始在不应该的地方构建小的参数解析器。<br />
<br />
<br />
<strong style="font-size: 18pt">6 其他<br />
</strong><br />
6.1 使用 has 或 is 前缀命名布尔元素</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">is_connect&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;True<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />has_member&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;False</span></div>
<p><br />
6.2 用复数形式命名序列</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">members&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">'</span><span style="color: #800000">user_1</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">user_2</span><span style="color: #800000">'</span><span style="color: #000000">]</span></div>
<p><br />
6.3 用显式名称命名字典</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">person_address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #800000">'</span><span style="color: #800000">user_1</span><span style="color: #800000">'</span><span style="color: #000000">:</span><span style="color: #800000">'</span><span style="color: #800000">10&nbsp;road&nbsp;WD</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">user_2</span><span style="color: #800000">'</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">20&nbsp;street&nbsp;huafu</span><span style="color: #800000">'</span><span style="color: #000000">}</span></div>
<p><br />
6.4 避免通用名称<br />
诸如 list, dict, sequence 或者 element 这样的名称应该避免。<br />
<br />
6.5 避免现有名称<br />
诸如 os, sys 这种系统已经存在的名称应该避免。<br />
<br />
<br />
<strong style="font-size: 18pt">7 一些数字</strong><br />
一行列数 : PEP 8 规定为 <strong>79 列</strong>，这有些苛刻了。根据自己的情况，比如不要超过满屏时编辑器的显示列数。这样就可以在不动水平游标的情况下，方便的查看代码。</p>
<p>
一个函数 : 不要超过 <strong>30 行</strong>代码, 即可显示在一个屏幕类，可以不使用垂直游标即可看到整个函数。<br />
一个类 : 不要超过 <strong>200 行</strong>代码，不要有超过 <strong>10 个</strong>方法。<br />
一个模块 不要超过 <strong>500 行</strong>。<br />
<br />
</p>
<p><br />
<strong><span style="font-size: 18pt; ">8 验证脚本</span></strong>
</p>
<p><span style="font-size: 18pt; "><span style="font-size: 12pt; ">可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。</span></span></p>
<p><span style="font-size: 18pt; "><span style="font-size: 12pt; ">&gt;&gt;easy_install pep8</span></span></p>
<p><span style="font-size: 18pt; "><span style="font-size: 12pt; ">&gt;&gt;pep8 -r --ignoire E501 Test.py</span></span></p>
<p><span style="font-size: 18pt; "><span style="font-size: 12pt; ">这个命令行的意思是，重复打出错误，并且忽略 501 错误(代码超过 79 行)。</span></span></p>
<img src ="http://www.blogjava.net/lincode/aggbug/343859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lincode/" target="_blank">lincode</a> 2011-02-02 00:45 <a href="http://www.blogjava.net/lincode/archive/2011/02/02/343859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django template 使用的编码格式</title><link>http://www.blogjava.net/lincode/archive/2009/12/31/307844.html</link><dc:creator>lincode</dc:creator><author>lincode</author><pubDate>Wed, 30 Dec 2009 22:37:00 GMT</pubDate><guid>http://www.blogjava.net/lincode/archive/2009/12/31/307844.html</guid><wfw:comment>http://www.blogjava.net/lincode/comments/307844.html</wfw:comment><comments>http://www.blogjava.net/lincode/archive/2009/12/31/307844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lincode/comments/commentRss/307844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lincode/services/trackbacks/307844.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Django 的 template 有继承功能。这两天遇到一个问题，<br>仅仅包含 {% extends "base.html" %} 一条语句的子 html 文件在浏览器中和 base.html 的渲染结果不一样。<br>搞了两天才找出问题的原因。是子文件选择了 UTF-8 格式。<br>所有的文件应该都选择 UTF-8 without BOM 格式。这样就得到一致的结果了。&nbsp;&nbsp;<a href='http://www.blogjava.net/lincode/archive/2009/12/31/307844.html'>阅读全文</a><img src ="http://www.blogjava.net/lincode/aggbug/307844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lincode/" target="_blank">lincode</a> 2009-12-31 06:37 <a href="http://www.blogjava.net/lincode/archive/2009/12/31/307844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Douban API 在 GAE 中的使用</title><link>http://www.blogjava.net/lincode/archive/2009/11/28/303993.html</link><dc:creator>lincode</dc:creator><author>lincode</author><pubDate>Sat, 28 Nov 2009 00:13:00 GMT</pubDate><guid>http://www.blogjava.net/lincode/archive/2009/11/28/303993.html</guid><wfw:comment>http://www.blogjava.net/lincode/comments/303993.html</wfw:comment><comments>http://www.blogjava.net/lincode/archive/2009/11/28/303993.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lincode/comments/commentRss/303993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lincode/services/trackbacks/303993.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Douban API 提供 python 版本，同时 GAE（google app engine）对于 python 的支持是相当好。所以可以容易地将 Douban API 集成到 GAE。&nbsp;&nbsp;<a href='http://www.blogjava.net/lincode/archive/2009/11/28/303993.html'>阅读全文</a><img src ="http://www.blogjava.net/lincode/aggbug/303993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lincode/" target="_blank">lincode</a> 2009-11-28 08:13 <a href="http://www.blogjava.net/lincode/archive/2009/11/28/303993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python, django 框架 开发环境的建立</title><link>http://www.blogjava.net/lincode/archive/2008/11/17/240901.html</link><dc:creator>lincode</dc:creator><author>lincode</author><pubDate>Sun, 16 Nov 2008 20:18:00 GMT</pubDate><guid>http://www.blogjava.net/lincode/archive/2008/11/17/240901.html</guid><wfw:comment>http://www.blogjava.net/lincode/comments/240901.html</wfw:comment><comments>http://www.blogjava.net/lincode/archive/2008/11/17/240901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lincode/comments/commentRss/240901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lincode/services/trackbacks/240901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: windows 中 python web 开发环境的建立， 使用 django 框架&nbsp;&nbsp;<a href='http://www.blogjava.net/lincode/archive/2008/11/17/240901.html'>阅读全文</a><img src ="http://www.blogjava.net/lincode/aggbug/240901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lincode/" target="_blank">lincode</a> 2008-11-17 04:18 <a href="http://www.blogjava.net/lincode/archive/2008/11/17/240901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>