forked from Qwertyssp/python_ebook
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPython 程式碼風格指引.htm
870 lines (833 loc) · 63 KB
/
Python 程式碼風格指引.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="verify-v1" content="nd9rIpE/qErlhLps5RU0SfHGRjxGGH8rsKuFHInQMTI=" />
<meta name="keywords" content="PEP 8 -- Style Guide for Python Code" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch_desc.php" title="JiaYun (English)" />
<link title="Creative Commons" type="application/rdf+xml" href="/index.php?title=PEP_8_--_Style_Guide_for_Python_Code&action=creativecommons" rel="meta" />
<link rel="copyright" href="http://creativecommons.org/licenses/by-nc-nd/3.0/" />
<link rel="alternate" type="application/rss+xml" title="JiaYun RSS Feed" href="http://wiki.jiayun.org/index.php?title=Special:Recentchanges&feed=rss" />
<link rel="alternate" type="application/atom+xml" title="JiaYun Atom Feed" href="http://wiki.jiayun.org/index.php?title=Special:Recentchanges&feed=atom" />
<title>PEP 8 -- Style Guide for Python Code - JiaYun</title>
<style type="text/css" media="screen, projection">/*<![CDATA[*/
@import "/skins/common/shared.css?116";
@import "/skins/modern/main.css?116";
/*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="/skins/modern/print.css?116" />
<!--[if lt IE 7]><meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "modern";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgScript = "/index.php";
var wgServer = "http://wiki.jiayun.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "PEP_8_--_Style_Guide_for_Python_Code";
var wgTitle = "PEP 8 -- Style Guide for Python Code";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "12";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "78";
var wgVersion = "1.12.0";
var wgEnableAPI = true;
var wgEnableWriteAPI = false;
/*]]>*/</script>
<script type="text/javascript" src="/skins/common/wikibits.js?116"><!-- wikibits js --></script>
<!-- Head Scripts -->
<script type="text/javascript" src="/skins/common/ajax.js?116"></script>
<style type="text/css">/*<![CDATA[*/
.source-python {line-height: normal;}
.source-python li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for python
* CSS class: source-python, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
* --------------------------------------
*/
.source-python .de1, .source-python .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-python {}
.source-python .head {}
.source-python .foot {}
.source-python .imp {font-weight: bold; color: red;}
.source-python li, .source-python li.li1 {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-python li.li2 {font-weight: bold;}
.source-python .kw1 {color: #ff7700;font-weight:bold;}
.source-python .kw2 {color: #008000;}
.source-python .kw3 {color: #dc143c;}
.source-python .kw4 {color: #0000cd;}
.source-python .co1 {color: #808080; font-style: italic;}
.source-python .coMULTI {color: #808080; font-style: italic;}
.source-python .es0 {color: #000099; font-weight: bold;}
.source-python .br0 {color: black;}
.source-python .sy0 {color: #66cc66;}
.source-python .st0 {color: #483d8b;}
.source-python .nu0 {color: #ff4500;}
.source-python .me1 {color: black;}
.source-python .ln-xtra, .source-python li.ln-xtra, .source-python div.ln-xtra {color: #cc0; background-color: #ffc;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style> <script type="text/javascript" src="/index.php?title=-&action=raw&gen=js&useskin=modern"><!-- site js --></script>
<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Common.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=MediaWiki:Modern.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=-&action=raw&gen=css&maxage=18000";
/*]]>*/</style>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-131011-4");
pageTracker._initData();
pageTracker._trackPageview();
</script>
</head>
<body class="mediawiki ns-0 ltr page-PEP_8_--_Style_Guide_for_Python_Code">
<!-- heading -->
<div id="mw_header">
<h1 id="firstHeading">PEP 8 -- Style Guide for Python Code</h1>
<span>「台灣中國,一邊一國」 Taiwan and China are two separate nations.</span>
</div>
<div id="mw_main">
<div id="mw_contentwrapper">
<!-- navigation portlet -->
<div id="p-cactions" class="portlet">
<h5>Views</h5>
<div class="pBody">
<ul>
<li id="ca-nstab-main" class="selected"><a href="/PEP_8_--_Style_Guide_for_Python_Code" title="View the content page [c]" accesskey="c">Page</a></li>
<li id="ca-talk" class="new"><a href="/index.php?title=Talk:PEP_8_--_Style_Guide_for_Python_Code&action=edit" title="Discussion about the content page [t]" accesskey="t">Discussion</a></li>
<li id="ca-viewsource"><a href="/index.php?title=PEP_8_--_Style_Guide_for_Python_Code&action=edit" title="This page is protected. You can view its source. [e]" accesskey="e">View source</a></li>
<li id="ca-history"><a href="/index.php?title=PEP_8_--_Style_Guide_for_Python_Code&action=history" title="Past versions of this page. [h]" accesskey="h">History</a></li>
</ul>
</div>
</div>
<!-- content -->
<div id="mw_content">
<!-- contentholder does nothing by default, but it allows users to style the text inside
the content area without affecting the meaning of 'em' in #mw_content, which is used
for the margins -->
<div id="mw_contentholder">
<div class='mw-topboxes'>
<div class="mw-topbox" id="siteSub">From JiaYun</div>
</div>
<div id="contentSub"></div>
<div align="center">
<script type="text/javascript"><!--
google_ad_client = "pub-8970740405227019";
google_ad_slot = "9010899491";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<div id="jump-to-nav">Jump to: <a href="#column-one">navigation</a>, <a href="#searchInput">search</a></div>
<table>
<tr>
<th align="right">PEP:
</th><td>8
</td></tr>
<tr>
<th align="right">Title:
</th><td>Style Guide for Python Code
</td></tr>
<tr>
<th align="right">中文標題:
</th><td>Python 程式碼風格指引
</td></tr>
<tr>
<th align="right">Version:
</th><td>60919
</td></tr>
<tr>
<th align="right">Last-Modified:
</th><td><a href="http://svn.python.org/view/*checkout*/peps/trunk/pep-0008.txt" class="external text" title="http://svn.python.org/view/*checkout*/peps/trunk/pep-0008.txt" rel="nofollow">2008-02-21 17:21:15 +0100 (Thu, 21 Feb 2008)</a>
</td></tr>
<tr>
<th align="right">Author:
</th><td>Guido van Rossum <guido at python.org>, Barry Warsaw <barry at python.org>
</td></tr>
<tr>
<th align="right">中文翻譯:
</th><td> JiaYun <jiayun at gmail.com>
</td></tr>
<tr>
<th align="right">Status:
</th><td>Active
</td></tr>
<tr>
<th align="right">Type:
</th><td>Process
</td></tr>
<tr>
<th align="right">Created:
</th><td>05-Jul-2001
</td></tr>
<tr>
<th align="right">Post-History:
</th><td>05-Jul-2001
</td></tr></table>
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#.E7.B0.A1.E4.BB.8B"><span class="tocnumber">1</span> <span class="toctext">簡介</span></a></li>
<li class="toclevel-1"><a href="#.E6.84.9A.E8.A0.A2.E7.9A.84.E4.B8.80.E8.87.B4.E6.80.A7.E6.98.AF.E5.B0.8F.E5.BF.83.E7.9C.BC.E4.B8.AD.E7.9A.84.E5.A6.96.E6.80.AA"><span class="tocnumber">2</span> <span class="toctext">愚蠢的一致性是小心眼中的妖怪</span></a></li>
<li class="toclevel-1"><a href="#.E7.A8.8B.E5.BC.8F.E7.A2.BC.E7.B7.A8.E6.8E.92"><span class="tocnumber">3</span> <span class="toctext">程式碼編排</span></a>
<ul>
<li class="toclevel-2"><a href="#.E7.B8.AE.E6.8E.92"><span class="tocnumber">3.1</span> <span class="toctext">縮排</span></a></li>
<li class="toclevel-2"><a href="#tab_.E6.88.96.E7.A9.BA.E7.99.BD.EF.BC.9F"><span class="tocnumber">3.2</span> <span class="toctext">tab 或空白?</span></a></li>
<li class="toclevel-2"><a href="#.E6.AF.8F.E8.A1.8C.E6.9C.80.E5.A4.A7.E9.95.B7.E5.BA.A6"><span class="tocnumber">3.3</span> <span class="toctext">每行最大長度</span></a></li>
<li class="toclevel-2"><a href="#.E7.A9.BA.E7.99.BD.E8.A1.8C"><span class="tocnumber">3.4</span> <span class="toctext">空白行</span></a></li>
<li class="toclevel-2"><a href="#.E7.B7.A8.E7.A2.BC.EF.BC.88PEP_263.EF.BC.89"><span class="tocnumber">3.5</span> <span class="toctext">編碼(PEP 263)</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#import"><span class="tocnumber">4</span> <span class="toctext">import</span></a></li>
<li class="toclevel-1"><a href="#expression_.E5.92.8C_statement_.E4.B8.AD.E7.9A.84.E7.A9.BA.E7.99.BD"><span class="tocnumber">5</span> <span class="toctext">expression 和 statement 中的空白</span></a>
<ul>
<li class="toclevel-2"><a href="#.E6.83.B1.E4.BA.BA.E7.91.A3.E4.BA.8B"><span class="tocnumber">5.1</span> <span class="toctext">惱人瑣事</span></a></li>
<li class="toclevel-2"><a href="#.E5.85.B6.E4.BB.96.E5.BB.BA.E8.AD.B0"><span class="tocnumber">5.2</span> <span class="toctext">其他建議</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#.E8.A8.BB.E8.A7.A3"><span class="tocnumber">6</span> <span class="toctext">註解</span></a>
<ul>
<li class="toclevel-2"><a href="#.E5.8D.80.E5.A1.8A.E8.A8.BB.E8.A7.A3"><span class="tocnumber">6.1</span> <span class="toctext">區塊註解</span></a></li>
<li class="toclevel-2"><a href="#.E8.A1.8C.E5.85.A7.E8.A8.BB.E8.A7.A3"><span class="tocnumber">6.2</span> <span class="toctext">行內註解</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#.E6.96.87.E4.BB.B6.E5.AD.97.E4.B8.B2"><span class="tocnumber">7</span> <span class="toctext">文件字串</span></a></li>
<li class="toclevel-1"><a href="#.E7.89.88.E6.9C.AC.E7.B4.80.E9.8C.84"><span class="tocnumber">8</span> <span class="toctext">版本紀錄</span></a></li>
<li class="toclevel-1"><a href="#.E5.91.BD.E5.90.8D.E6.85.A3.E4.BE.8B"><span class="tocnumber">9</span> <span class="toctext">命名慣例</span></a>
<ul>
<li class="toclevel-2"><a href="#.E5.91.BD.E5.90.8D.E9.A2.A8.E6.A0.BC.E6.95.98.E8.BF.B0"><span class="tocnumber">9.1</span> <span class="toctext">命名風格敘述</span></a></li>
<li class="toclevel-2"><a href="#.E5.91.BD.E5.90.8D.E6.85.A3.E4.BE.8B.E8.A6.8F.E7.AF.84"><span class="tocnumber">9.2</span> <span class="toctext">命名慣例規範</span></a>
<ul>
<li class="toclevel-3"><a href="#.E9.81.BF.E5.85.8D.E4.BD.BF.E7.94.A8.E7.9A.84.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.1</span> <span class="toctext">避免使用的名稱</span></a></li>
<li class="toclevel-3"><a href="#package_.E5.92.8C_module_.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.2</span> <span class="toctext">package 和 module 名稱</span></a></li>
<li class="toclevel-3"><a href="#class_.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.3</span> <span class="toctext">class 名稱</span></a></li>
<li class="toclevel-3"><a href="#exception_.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.4</span> <span class="toctext">exception 名稱</span></a></li>
<li class="toclevel-3"><a href="#.E5.85.A8.E5.9F.9F.E8.AE.8A.E6.95.B8.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.5</span> <span class="toctext">全域變數名稱</span></a></li>
<li class="toclevel-3"><a href="#function_.E5.90.8D.E7.A8.B1"><span class="tocnumber">9.2.6</span> <span class="toctext">function 名稱</span></a></li>
<li class="toclevel-3"><a href="#function_.E5.92.8C_method_.E5.8F.83.E6.95.B8"><span class="tocnumber">9.2.7</span> <span class="toctext">function 和 method 參數</span></a></li>
<li class="toclevel-3"><a href="#method_.E5.90.8D.E7.A8.B1.E5.92.8C_instance_.E8.AE.8A.E6.95.B8"><span class="tocnumber">9.2.8</span> <span class="toctext">method 名稱和 instance 變數</span></a></li>
<li class="toclevel-3"><a href="#.E7.82.BA.E7.B9.BC.E6.89.BF.E8.80.8C.E8.A8.AD.E8.A8.88"><span class="tocnumber">9.2.9</span> <span class="toctext">為繼承而設計</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="#.E7.A8.8B.E5.BC.8F.E6.92.B0.E5.AF.AB.E5.BB.BA.E8.AD.B0"><span class="tocnumber">10</span> <span class="toctext">程式撰寫建議</span></a></li>
<li class="toclevel-1"><a href="#References"><span class="tocnumber">11</span> <span class="toctext">References</span></a></li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name=".E7.B0.A1.E4.BB.8B"></a><h2> <span class="mw-headline"> 簡介 </span></h2>
<p>本文件提供 Python 主要發行版本標準程式庫中的 Python 程式碼所用的撰寫慣例。關於 Python 的 C 實作中所用的 C 語言風格指引,請參考相關的 PEP[1]。
</p><p>本文件改寫自 Guido 所寫的 Python 風格指引文章[2],並增添一些 Barry 的風格指引[5]的內容。當兩者有衝突時,本 PEP 以 Guido 風格為準。本 PEP 可能仍未完成(事實上,可能永遠不會完工 <眨眼>)。
</p>
<a name=".E6.84.9A.E8.A0.A2.E7.9A.84.E4.B8.80.E8.87.B4.E6.80.A7.E6.98.AF.E5.B0.8F.E5.BF.83.E7.9C.BC.E4.B8.AD.E7.9A.84.E5.A6.96.E6.80.AA"></a><h2> <span class="mw-headline"> 愚蠢的一致性是小心眼中的妖怪 </span></h2>
<p>Guido 的重要見解之一是:程式碼被閱讀的次數,遠大於被撰寫的次數。提供本指引的目的,是為了增進程式碼的可讀性,並使 Python 程式碼在各方面保持一致性。如同 <a href="http://www.python.org/dev/peps/pep-0020" class="external text" title="http://www.python.org/dev/peps/pep-0020" rel="nofollow">PEP 20</a> [6] 所說的「可讀性至關重要」。
</p><p>風格指引關注的是一致性。和本指引一致很重要,在專案中保持一致性又更重要,但在 module 或 function 中保持一致性則最重要。
</p><p>但更更重要的是:知道何時該不一致 -- 有時候風格指引就是無法適用。有疑惑時,運用你的最佳判斷力。看看其他例子,並決定何者最好看。需要的時候,儘管發問。
</p><p>打破特定規則的兩個好理由:
</p>
<ol><li> 使用該規則會造成程式碼可讀性變差,特別是對習慣該規則的人來說,可讀性也變差的時候。
</li><li> 為了和前後(可能是因為歷史性因素)打破該規則的程式碼保持一致性時 -- 雖然這也是清理他人雜亂程式碼的時機(在真正的 Extreme Programming 開發中)。
</li></ol>
<a name=".E7.A8.8B.E5.BC.8F.E7.A2.BC.E7.B7.A8.E6.8E.92"></a><h2> <span class="mw-headline"> 程式碼編排 </span></h2>
<a name=".E7.B8.AE.E6.8E.92"></a><h3> <span class="mw-headline"> 縮排 </span></h3>
<p>每個縮排層級使用 4 個空白。
</p><p>在相當舊的程式碼中,為了一致可以繼續使用 tab。
</p>
<a name="tab_.E6.88.96.E7.A9.BA.E7.99.BD.EF.BC.9F"></a><h3> <span class="mw-headline"> tab 或空白? </span></h3>
<p>絕對不要混用 tab 和空白。
</p><p>縮排 Python 最常用的方式是只用空白。第二常用的方式是只用 tab。混用 tab 和空白來縮排的程式碼,應該轉成只用空白。在呼叫 Python 直譯器時加上 -t 選項,它會對混用 tab 和空白的程式發出警告。若使用 -tt 選項,則發出的會是錯誤。非常推薦使用這些選項!
</p><p>對於新專案來說,只用空白比用 tab 更受推薦。大多數編輯器都有相關設定,可以很容易做到這點。
</p>
<a name=".E6.AF.8F.E8.A1.8C.E6.9C.80.E5.A4.A7.E9.95.B7.E5.BA.A6"></a><h3> <span class="mw-headline"> 每行最大長度 </span></h3>
<p>將每一行限制在最多 79 個字元之內。
</p><p>仍然有很多裝置受限於每行 80 個字元;而且視窗寬度限制在 80 個字元內,可以方便讓多個視窗並排。這些裝置的預設斷行機制會破壞程式碼的顯示結構,而使程式碼更難理解。所以,請將每一行限制在最多 79 個字元之內。對於大區段的文字(docstring 或註解),建議每行限制在 72 個字元內。
</p><p>建議的斷行方式是運用圓括號、方括號、大括號在 Python 中隱含的行接續作用。若需要,也可以對 expression 增加額外的圓括號,但有時只用反斜線看起來會更好。確保接續的行有妥善縮排。一些例子:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">class</span> Rectangle<span class="br0">(</span>Blob<span class="br0">)</span>:
<span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">(</span><span class="kw2">self</span>, width, height,
color=<span class="st0">'black'</span>, emphasis=<span class="kw2">None</span>, highlight=<span class="nu0">0</span><span class="br0">)</span>:
<span class="kw1">if</span> width == <span class="nu0">0</span> <span class="kw1">and</span> height == <span class="nu0">0</span> <span class="kw1">and</span> \
color == <span class="st0">'red'</span> <span class="kw1">and</span> emphasis == <span class="st0">'strong'</span> <span class="kw1">or</span> \
highlight <span class="sy0">></span> <span class="nu0">100</span>:
<span class="kw1">raise</span> <span class="kw2">ValueError</span><span class="br0">(</span><span class="st0">"sorry, you lose"</span><span class="br0">)</span>
<span class="kw1">if</span> width == <span class="nu0">0</span> <span class="kw1">and</span> height == <span class="nu0">0</span> <span class="kw1">and</span> <span class="br0">(</span>color == <span class="st0">'red'</span> <span class="kw1">or</span>
emphasis <span class="kw1">is</span> <span class="kw2">None</span><span class="br0">)</span>:
<span class="kw1">raise</span> <span class="kw2">ValueError</span><span class="br0">(</span><span class="st0">"I don't think so"</span><span class="br0">)</span>
Blob.<span class="kw4">__init__</span><span class="br0">(</span><span class="kw2">self</span>, width, height,
color, emphasis, highlight<span class="br0">)</span></pre></div>
<a name=".E7.A9.BA.E7.99.BD.E8.A1.8C"></a><h3> <span class="mw-headline"> 空白行 </span></h3>
<p>將最高層級的 function 和 class 定義以兩個空白行分隔。
</p><p>class 內的 method 定義之間以一個空白行分隔。
</p><p>額外的空白行可以(謹慎地)用於分隔不同群組的相關 function。在一群相關的單行程式碼中(例如一組空的實作),空白行可以省略。
</p><p>在 function 中,小心地使用空白行來表示邏輯上的分段。
</p><p>Python 將 control-L(也就是 ^L)換頁字元視為空白。很多工具將這字元用於表示換頁,所以在你的檔案中,可以用它來為各相關區段作分頁。
</p>
<a name=".E7.B7.A8.E7.A2.BC.EF.BC.88PEP_263.EF.BC.89"></a><h3> <span class="mw-headline"> 編碼(<a href="http://www.python.org/dev/peps/pep-0263" class="external text" title="http://www.python.org/dev/peps/pep-0263" rel="nofollow">PEP 263</a>) </span></h3>
<p>Python 核心發行版本中的程式碼應該都使用 ASCII 或 Latin-1(即 ISO-8859-1)編碼。對於 Python 3.0 或以上版本,UTF-8 比 Latin-1 更建議使用,參考 <a href="http://www.python.org/dev/peps/pep-3120" class="external text" title="http://www.python.org/dev/peps/pep-3120" rel="nofollow">PEP 3120</a>。
</p><p>使用 ASCII(或 UTF-8,在 Python 3.0 時)的程式檔案不該使用編碼指示(像是 "coding: utf-8")。Latin-1(或 UTF-8)應該只用在註解或 docstring 提到作者的名字需要時;否則建議在字串常量中,使用 \x、\u 或 \U 等轉義字符來表示非 ASCII 資料。
</p><p>對於 Python 3.0 或以上版本,標準程式庫規定使用以下方針(參考 <a href="http://www.python.org/dev/peps/pep-3131" class="external text" title="http://www.python.org/dev/peps/pep-3131" rel="nofollow">PEP 3131</a>):所有 Python 標準程式庫中的識別字「必須」使用僅含 ASCII 的識別字,而且「應該」在可能的時候都用英文的單字(很多情況下所用的縮寫或技術術語並不是英語)。另外,字串常量或註解也都必須是 ASCII 編碼。例外情況只能是 (a) 測試非 ASCII 功能的測試案例,和 (b) 作者的名字。名字不是拉丁字母組成的作者,「必須」提供名字的拉丁音譯。
</p><p>對於擁有全球性使用者的開放原始碼專案,也鼓勵採用類似的方針。
</p>
<a name="import"></a><h2> <span class="mw-headline"> import </span></h2>
<ul><li> import 通常應該分成不同行,例如:
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">import</span> <span class="kw3">os</span>
<span class="kw1">import</span> <span class="kw3">sys</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">import</span> <span class="kw3">sys</span>, <span class="kw3">os</span></pre></div>
<p>但這種情況是可以的:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">from</span> <span class="kw3">subprocess</span> <span class="kw1">import</span> Popen, PIPE</pre></div>
</blockquote>
<ul><li> import 應該永遠放在檔案頂端,也就是在 module 的註解和 docstring 之後,而在 module 的全域變數和常數之前。
</li></ul>
<blockquote>
import 應該以以下順序分組:
<ol><li> 標準程式庫的 import
</li><li> 相關第三方程式庫的 import
</li><li> 己方應用程式/程式庫特定的 import
</li></ol>
每組 import 之間應該以一個空白行分隔。
將任何相關的 __all__ 細述放在 import 之下。
</blockquote>
<ul><li> 極不鼓勵在 package 之間使用相對 import。
</li></ul>
<blockquote>
所有 import 都要永遠用 package 的絕對路徑。雖然現在 <a href="http://www.python.org/dev/peps/pep-0328" class="external text" title="http://www.python.org/dev/peps/pep-0328" rel="nofollow">PEP 328</a> [7] 已經在 Python 2.5 中完全實作,但它明確表明相對 import 的方式仍不鼓勵使用;絕對 import 更有可攜性,通常也更有可讀性。
</blockquote>
<ul><li> 從含有 class 定義的 module 中 import class 時,這樣寫通常是可以的
</li></ul>
<blockquote>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">from</span> myclass <span class="kw1">import</span> MyClass
<span class="kw1">from</span> foo.<span class="me1">bar</span>.<span class="me1">yourclass</span> <span class="kw1">import</span> YourClass</pre></div>
<p>如果會造成命名衝突,可以改成
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">import</span> myclass
<span class="kw1">import</span> foo.<span class="me1">bar</span>.<span class="me1">yourclass</span></pre></div>
<p>然後使用 "myclass.MyClass" 和 "foo.bar.yourclass.YourClass"
</p>
</blockquote>
<a name="expression_.E5.92.8C_statement_.E4.B8.AD.E7.9A.84.E7.A9.BA.E7.99.BD"></a><h2> <span class="mw-headline"> expression 和 statement 中的空白 </span></h2>
<a name=".E6.83.B1.E4.BA.BA.E7.91.A3.E4.BA.8B"></a><h3> <span class="mw-headline"> 惱人瑣事 </span></h3>
<p>在以下情況避免使用額外的空白:
</p>
<ul><li> 緊連在圓括號、方括號、大括號之內。
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python">spam<span class="br0">(</span>ham<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span>, <span class="br0">{</span>eggs: <span class="nu0">2</span><span class="br0">}</span><span class="br0">)</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">spam<span class="br0">(</span> ham<span class="br0">[</span> <span class="nu0">1</span> <span class="br0">]</span>, <span class="br0">{</span> eggs: <span class="nu0">2</span> <span class="br0">}</span> <span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 逗號、分號、冒號前:
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> x == <span class="nu0">4</span>: <span class="kw1">print</span> x, y<span class="sy0">;</span> x, y = y, x</pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> x == <span class="nu0">4</span> : <span class="kw1">print</span> x , y <span class="sy0">;</span> x , y = y , x</pre></div>
</blockquote>
<ul><li> 函式呼叫的參數傳遞左括號前:
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python">spam<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">spam <span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 索引和 slice 的左括號前:
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw2">dict</span><span class="br0">[</span><span class="st0">'key'</span><span class="br0">]</span> = <span class="kw2">list</span><span class="br0">[</span>index<span class="br0">]</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw2">dict</span> <span class="br0">[</span><span class="st0">'key'</span><span class="br0">]</span> = <span class="kw2">list</span> <span class="br0">[</span>index<span class="br0">]</span></pre></div>
</blockquote>
<ul><li> 在賦值(或其他)運算子前後用了一個以上的空白,只為了和另一個對齊。
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python">x = <span class="nu0">1</span>
y = <span class="nu0">2</span>
long_variable = <span class="nu0">3</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">x = <span class="nu0">1</span>
y = <span class="nu0">2</span>
long_variable = <span class="nu0">3</span></pre></div>
</blockquote>
<a name=".E5.85.B6.E4.BB.96.E5.BB.BA.E8.AD.B0"></a><h3> <span class="mw-headline"> 其他建議 </span></h3>
<ul><li> 永遠在這些二元運算子前後加上一個空白:賦值(=)、增量賦值(+=, -= 之類)、比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not)、邏輯(and, or, not)。
</li></ul>
<ul><li> 算術運算子前後使用空白:
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python">i = i + <span class="nu0">1</span>
submitted += <span class="nu0">1</span>
x = x <span class="sy0">*</span> <span class="nu0">2</span> - <span class="nu0">1</span>
hypot2 = x <span class="sy0">*</span> x + y <span class="sy0">*</span> y
c = <span class="br0">(</span>a + b<span class="br0">)</span> <span class="sy0">*</span> <span class="br0">(</span>a - b<span class="br0">)</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">i=i<span class="nu0">+1</span>
submitted +=<span class="nu0">1</span>
x = x<span class="sy0">*</span><span class="nu0">2</span> - <span class="nu0">1</span>
hypot2 = x<span class="sy0">*</span>x + y<span class="sy0">*</span>y
c = <span class="br0">(</span>a+b<span class="br0">)</span> <span class="sy0">*</span> <span class="br0">(</span>a-b<span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 當 '=' 符號是用在關鍵字參數或預設參數值時,不要加空白。
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">def</span> <span class="kw2">complex</span><span class="br0">(</span>real, imag=<span class="nu0">0.0</span><span class="br0">)</span>:
<span class="kw1">return</span> magic<span class="br0">(</span>r=real, i=imag<span class="br0">)</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">def</span> <span class="kw2">complex</span><span class="br0">(</span>real, imag = <span class="nu0">0.0</span><span class="br0">)</span>:
<span class="kw1">return</span> magic<span class="br0">(</span>r = real, i = imag<span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 複合 statement (一行有多個 statement)通常不鼓勵使用。
</li></ul>
<blockquote>
這樣寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo == <span class="st0">'blah'</span>:
do_blah_thing<span class="br0">(</span><span class="br0">)</span>
do_one<span class="br0">(</span><span class="br0">)</span>
do_two<span class="br0">(</span><span class="br0">)</span>
do_three<span class="br0">(</span><span class="br0">)</span></pre></div>
<p>盡量不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo == <span class="st0">'blah'</span>: do_blah_thing<span class="br0">(</span><span class="br0">)</span>
do_one<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> do_two<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> do_three<span class="br0">(</span><span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 雖然有時 if/for/while 的主體短,可以整個放在同一行,但絕對不要在多子句時這麼做。也要避免摺疊這類長行!
</li></ul>
<blockquote>
盡量不要寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo == <span class="st0">'blah'</span>: do_blah_thing<span class="br0">(</span><span class="br0">)</span>
<span class="kw1">for</span> x <span class="kw1">in</span> lst: total += x
<span class="kw1">while</span> t <span class="sy0"><</span> <span class="nu0">10</span>: t = delay<span class="br0">(</span><span class="br0">)</span></pre></div>
<p>更是別寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo == <span class="st0">'blah'</span>: do_blah_thing<span class="br0">(</span><span class="br0">)</span>
<span class="kw1">else</span>: do_non_blah_thing<span class="br0">(</span><span class="br0">)</span>
<span class="kw1">try</span>: something<span class="br0">(</span><span class="br0">)</span>
<span class="kw1">finally</span>: cleanup<span class="br0">(</span><span class="br0">)</span>
do_one<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> do_two<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> do_three<span class="br0">(</span><span class="kw2">long</span>, argument,
<span class="kw2">list</span>, like, this<span class="br0">)</span>
<span class="kw1">if</span> foo == <span class="st0">'blah'</span>: one<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> two<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> three<span class="br0">(</span><span class="br0">)</span></pre></div>
</blockquote>
<a name=".E8.A8.BB.E8.A7.A3"></a><h2> <span class="mw-headline"> 註解 </span></h2>
<p>註解和程式碼牴觸比沒有註解還糟。更改程式碼之後,永遠將更新註解列為優先事項。
</p><p>註解應該是完整的句子。當註解是片語或句子時,第一個單字應該大寫,除非它是一個小寫開頭的識別字(絕對不要改變識別字的大小寫!)。
</p><p>如果註解很短,結尾的句點可以省略。區塊註解通常包含由完整句子組成的一或多個段落,其中每個句子都該以句點作結尾。
</p><p>每個句子的句點後應該加兩個空白。
</p><p>寫英文時,Strunk 和 White 的 "The Elements of Style" 值得參考。
</p><p>非英語系國家的 Python 程式設計師:請用英文寫註解,除非 120% 確定不會有不懂你語言的人閱讀你的程式碼。
</p>
<a name=".E5.8D.80.E5.A1.8A.E8.A8.BB.E8.A7.A3"></a><h3> <span class="mw-headline"> 區塊註解 </span></h3>
<p>區塊註解通常用來註解下方的一段(或全部)程式碼,並和程式碼使用相同縮排層級。區塊註解的每一行開頭都是 # 和一個空白(除非該行在註解中需要縮排)。
</p><p>區塊註解中的段落之間,以只有一個 # 的行分隔。
</p>
<a name=".E8.A1.8C.E5.85.A7.E8.A8.BB.E8.A7.A3"></a><h3> <span class="mw-headline"> 行內註解 </span></h3>
<p>有節制地使用行內註解。
</p><p>行內註解是和 statement 在同一行的註解。行內註解和 statement 之間應該至少用兩個空白分隔。行內註解的開頭應該是 # 和一個空白。
</p><p>行內註解若只陳述明顯事實,則是不必要且實際上是造成干擾的。不要這樣寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">x = x + <span class="nu0">1</span> <span class="co1"># Increment x</span></pre></div>
<p>但有時,這樣是有用的
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">x = x + <span class="nu0">1</span> <span class="co1"># Compensate for border</span></pre></div>
<a name=".E6.96.87.E4.BB.B6.E5.AD.97.E4.B8.B2"></a><h2> <span class="mw-headline"> 文件字串 </span></h2>
<p>好的文件字串(即 docstring)撰寫慣例載於 <a href="http://www.python.org/dev/peps/pep-0257" class="external text" title="http://www.python.org/dev/peps/pep-0257" rel="nofollow">PEP 257</a> [3]。
</p>
<ul><li> 所有 public 的 module、function、class、method 都該寫文件字串。非 public 的 method 不需要寫文件字串,但應該用註解描述該 method 的作用。這註解應該放在 "def" 行之下。
</li></ul>
<ul><li> <a href="http://www.python.org/dev/peps/pep-0257" class="external text" title="http://www.python.org/dev/peps/pep-0257" rel="nofollow">PEP 257</a> 敘述了好的文件字串慣例。注意最重要的是,多行文件字串結尾的 """ 應該自己獨立一行,而且前面最好加一個空白行,例如:
</li></ul>
<blockquote>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="st0">""</span><span class="st0">"Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"</span><span class="st0">""</span></pre></div>
</blockquote>
<ul><li> 對於只有一行的 docstring,結尾的 """ 可以放在同一行。
</li></ul>
<a name=".E7.89.88.E6.9C.AC.E7.B4.80.E9.8C.84"></a><h2> <span class="mw-headline"> 版本紀錄 </span></h2>
<p>如果需要在原始檔中加進 Subversion、CVS 或 RCS 的資料,可以這樣做:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python">__version__ = <span class="st0">"$Revision: 60919 $"</span>
<span class="co1"># $Source$</span></pre></div>
<p>這幾行應該放在 module 的 docstring 之下,而在其他程式碼之前,並在上下各以一個空白行分隔。(譯註:Subversion 的話,第二行應該可以改用 "# $Id$")
</p>
<a name=".E5.91.BD.E5.90.8D.E6.85.A3.E4.BE.8B"></a><h2> <span class="mw-headline"> 命名慣例 </span></h2>
<p>Python 程式庫的命名慣例有點混亂,所以不太可能讓它完全一致 -- 不過這裡提供的是目前建議的命名標準。新的 module 和 package(包括第三方 framework)都應該依此標準撰寫,不過當現存的程式庫用的是不同風格時,保持內部的一致性比較重要。
</p>
<a name=".E5.91.BD.E5.90.8D.E9.A2.A8.E6.A0.BC.E6.95.98.E8.BF.B0"></a><h3> <span class="mw-headline"> 命名風格敘述 </span></h3>
<p>有許多不同的命名風格,不論用在何處,能夠將它們辨認出來會很有幫助。
</p><p>以下命名風格通常可以分辨出來:
</p>
<ul><li> b (單個小寫字母)
</li></ul>
<ul><li> B (單個大寫字母)
</li></ul>
<ul><li> lowercase (小寫)
</li></ul>
<ul><li> lower_case_with_underscores (含底線的小寫)
</li></ul>
<ul><li> UPPERCASE (大寫)
</li></ul>
<ul><li> UPPER_CASE_WITH_UNDERSCORES (含底線的大寫)
</li></ul>
<ul><li> CapitalizedWords (字首大寫,又稱 CapWords 或 CamelCase -- 如此稱呼是因為字母看起來崎嶇不平[4]),有時也稱為 StudlyCaps。
</li></ul>
<blockquote>
注意:如果有縮寫字,將縮寫字的每個字母大寫。也就是寫 HTTPServerError 比 HttpServerError 好。
</blockquote>
<ul><li> mixedCase (類似字首大寫,只差開頭單字的第一個字母是小寫)
</li></ul>
<ul><li> Capitalized_Words_With_Underscores (字首大寫加底線,很醜!)
</li></ul>
<p>也有一種風格是用一個獨特的短字首將相關的名稱歸類在一起。這方法在 Python 中用得不多,但為了完整還是需要一提。例如 os.stat() function 回傳一個 tuple,其中各項的名稱習慣上都類似 st_mode,st_size,st_mtime 之類。(這是為了強調這些欄位和 POSIX system call struct 的對應關係,幫助程式設計師熟悉。)
</p><p>X11 程式庫的所有 public function 都以 X 開頭。在 Python 中,這種風格通常是不需要的,因為 attribute 和 method 名稱前面都會接物件名稱,而 function 名稱前面則會接 module 名稱。
</p><p>另外,以下是幾種開頭或結尾加底線的特殊格式(這些通常可以和任何大小寫慣例合用):
</p>
<ul><li> _single_leading_underscore 開頭單一底線:不具強制力的「內部用」標示。在 "from M import *" 時不會 import 名稱是單一底線開頭的項目。
</li></ul>
<ul><li> single_trailing_underscore_ 結尾單一底線:慣例上用於避免和 Python 關鍵字衝突,例
</li></ul>
<blockquote>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw3">Tkinter</span>.<span class="me1">Toplevel</span><span class="br0">(</span>master, class_=<span class="st0">'ClassName'</span><span class="br0">)</span></pre></div>
</blockquote>
<ul><li> __double_leading_underscore 開頭雙底線:用來命名 class 的 attribute 時,會造成 name mangling(class FooBar 中,__boo 會變成 _FooBar__boo;參考下方相關處)。
</li></ul>
<ul><li> __double_leading_and_trailing_underscore__ 開頭和結尾雙底線:存在於使用者控制的命名空間中的「魔術」物件。例如 __init__、__import__、__file__。不要自創這類的名稱,只照文件說明去使用它們就好。
</li></ul>
<a name=".E5.91.BD.E5.90.8D.E6.85.A3.E4.BE.8B.E8.A6.8F.E7.AF.84"></a><h3> <span class="mw-headline"> 命名慣例規範 </span></h3>
<a name=".E9.81.BF.E5.85.8D.E4.BD.BF.E7.94.A8.E7.9A.84.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> 避免使用的名稱 </span></h4>
<p>不要用單個 `l'(小寫 L)、`O'(大寫 o)、`I'(大寫 i)當變數名稱。
</p><p>在某些字型,這些字元和數字的一和零難以分辨。需要暫時用 `l' 時,改用 `L'。
</p>
<a name="package_.E5.92.8C_module_.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> package 和 module 名稱 </span></h4>
<p>module 應該用全小寫的簡短名稱。若能增加可讀性,可以在其中加入底線。Python 的 package 也該用全小寫的簡短名稱,但底線不鼓勵使用。
</p><p>因為 module 名稱對應到檔案名稱,而有些檔案系統不會區分大小寫且會將長名稱縮短,所以選擇相當簡短的 module 名稱很重要 -- 雖然這在 Unix 上不是問題,但會在需要將程式移植到舊的 Mac 或 Windows 版本以及 DOS 時產生問題。
</p><p>當 C 或 C++ 寫的擴充 module 有對應的 Python module 提供高階介面(比較物件導向)時,C/C++ 的 module 開頭會有一個底線(像是 _socket)。
</p>
<a name="class_.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> class 名稱 </span></h4>
<p>幾乎沒有例外,class 名稱使用字首大寫慣例。僅供內部用的 class,名稱前會加一個底線。
</p>
<a name="exception_.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> exception 名稱 </span></h4>
<p>因為 exception 必須是 class,class 的命名慣例在此適用。不過 exception 實際是代表錯誤時,名稱必須用 "Error" 當字尾。
</p>
<a name=".E5.85.A8.E5.9F.9F.E8.AE.8A.E6.95.B8.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> 全域變數名稱 </span></h4>
<p>(希望這些變數只是為了在一個 module 內部使用。)全域變數命名慣例幾乎和 function 一樣。
</p><p>設計以 "from M import *" 使用的 module 應該用 __all__ 機制避免將全域變數匯出,或者按照較舊的慣例將這些全域變數字首都加一個底線(你可能也想藉此來將這些全域變數標示為「module 內部用」)。
</p>
<a name="function_.E5.90.8D.E7.A8.B1"></a><h4> <span class="mw-headline"> function 名稱 </span></h4>
<p>function 名稱應該全部小寫,為了可讀性,單字間可用底線分隔。
</p><p>mixedCase 只能用在這種風格已佔多數的程式碼中(例如 threading.py),或者為了保持相容性時。
</p>
<a name="function_.E5.92.8C_method_.E5.8F.83.E6.95.B8"></a><h4> <span class="mw-headline"> function 和 method 參數 </span></h4>
<p>instance method 的第一個參數永遠用 'self'。
</p><p>class method 的第一個參數永遠用 'cls'。
</p><p>當 function 參數名稱和保留的關鍵字衝突時,在字尾加一個底線比用縮寫或拼寫省略好。因此 "print_" 比 "prnt" 好。(可能更好的是用同義字避免這類衝突。)
</p>
<a name="method_.E5.90.8D.E7.A8.B1.E5.92.8C_instance_.E8.AE.8A.E6.95.B8"></a><h4> <span class="mw-headline"> method 名稱和 instance 變數 </span></h4>
<p>使用 function 的命名規則:小寫並在需要時用底線分隔單字增加可讀性。
</p><p>只有非 public 的 method 和 instance 變數才在開頭加一個底線。
</p><p>為了避免和 subclass 衝突,可在開頭加雙底線以利用 Python 的 name mangling 機制。
</p><p>Python 會用 class 名稱 mangle 這些雙底線開頭的名稱:如果 class Foo 有個叫做 __a 的 attribute,它無法以 Foo.__a 存取。(執意存取的使用者可以透過 Foo._Foo__a 存取。)一般而言,雙底線開頭只應該用在避免為繼承設計的 class 的 attribute 名稱衝突。
</p><p>注意:雙底線開頭的名稱有一些爭議(見下方)。
</p>
<a name=".E7.82.BA.E7.B9.BC.E6.89.BF.E8.80.8C.E8.A8.AD.E8.A8.88"></a><h4> <span class="mw-headline"> 為繼承而設計 </span></h4>
<p>永遠決定好 class 的 method 和 instance 變數(全部統稱為:attribute)是該 public 或非 public。不確定時,選擇非 public;在之後將它改成 public 比將 public attribute 改成非 public 容易。
</p><p>public attribute 是在保證不會有不相容變動下,預計供 class 的不相關用戶使用的。非 public attribute 則是不打算供第三方使用;不需要保證非 public 的 attribute 不會變動或甚至移除。
</p><p>這裡不用 "private" 這個詞,是因為 Python 中沒有任何 attribute 可以真正是 private(若不費一番不必要的苦工)。
</p><p>另一類 attribute 是那些屬於 "subclass API" 的一部分的(在其他語言通常叫做 "protected")。有些 class 是專門設計成要被繼承,以擴展或修改 class 的功能。設計這種 class 時,注意明確地決定哪些 attribute 是 public,哪些是 subclass API 的一部分,哪些則是只供 class 本身使用。
</p><p>謹記這些 Pythonic 指導原則:
</p>
<ul><li> public 的 attribute 開頭不該有底線。
</li></ul>
<ul><li> 如果 public 的 attribute 名稱和保留的關鍵字衝突,在名稱後加一個底線。這樣做比用縮寫或省略拼寫好。(不過雖然有這項規則,'cls' 還是建議用在變數或參數是一個 class 的時候,特別是 class method 的第一個參數。)
</li></ul>
<blockquote>
注意:參考上面有關 class method 參數名稱的建議。
</blockquote>
<ul><li> 對於簡單的資料型 public attribute,最好只提供 attribute 名稱,不要有複雜的 accessor/mutator method。要記得 Python 為以後的改進提供容易的辦法,以便你發現簡單的資料型 attribute 需要發展成函式型的功能時利用。在那種情況下,用 property 將函式性的實作隱藏在簡單資料型 attribute 的存取語法後面。
<ul><li> 注意一:property 只在 new-style class 中有作用。(譯註:new-style class 表示至少繼承了一個 class;classic class 則完全沒繼承別的 class)
</li><li> 注意二:試著讓函式型功能沒有副作用,雖然像暫存之類的副作用通常是好的。
</li><li> 注意三:避免將 property 用在需要大量運算的處理上;attribute 表示法會讓呼叫端相信它存取起來是(較)不費工的。
</li></ul>
</li></ul>
<ul><li> 如果 class 打算被繼承,但有些 attribute 不想讓 subclass 使用,考慮將它們命名成開頭有雙底線而結尾沒有底線。這會啟動 Python 的 name mangling 機制,讓 class 名稱被 mangle 到 attribute 的名稱。如此有助於避免 subclass 的 attribute 不小心用了相同名稱時造成的衝突。
<ul><li> 注意一:只有單單 class 名稱(不含 module 和 package)會用於 mangle 之後的名稱,所以如果 subclass 選擇了相同的 class 名稱和 attribute 名稱,還是會導致名稱衝突。
</li><li> 注意二:name mangling 可能會使得某些用途上較不方便(像是 debug 和 __getattr__())。不過 name mangling 機制有完善的文件說明,很容易可以手動處理。
</li><li> 注意三:不是每個人都喜歡 name mangling。試著在避免意外名稱衝突的需要,和使用者可能是進階使用者之間取得平衡。
</li></ul>
</li></ul>
<a name=".E7.A8.8B.E5.BC.8F.E6.92.B0.E5.AF.AB.E5.BB.BA.E8.AD.B0"></a><h2> <span class="mw-headline"> 程式撰寫建議 </span></h2>
<ul><li> 程式應該以不會在特定 Python 實作(PyPy, Jython, IronPython, Pyrex, Psyco 之類)上不利的方式撰寫。
</li></ul>
<blockquote>
舉例來說,不要依賴 CPython 對像 a+=b 或 a=a+b 這類形式的 statement 的高效能就地字串串接實作。這些 statement 在 Jython 中執行比較慢。在程式庫效能要求高的部分,應該使用 ''.join() 形式。這樣可以確保串接在各種實作中,都只耗費線性時間。
</blockquote>
<ul><li> 和像 None 這樣的 singleton 比較時,應該永遠使用 'is' 或 'is not',絕對不要用相等運算子。
</li></ul>
<blockquote>
也要注意寫了 "if x" 但其實是想表達 "if x is not None" 的情況 -- 例如,測試預設值是 None 的變數或參數是否設了新值時。新值可能是在邏輯判斷中有機會被當作 false 的型別(例如容器)!
</blockquote>
<ul><li> 使用 class 型 exception
</li></ul>
<blockquote>
字串型 exception 在新程式碼中禁止使用,因為這功能將在 Python 2.6 移除。
module 和 package 應該定義它們自己特定的基礎 exception class,這些 class 應該是內建 Exception class 的 subclass。永遠寫上 class 的文件字串。例如:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">class</span> MessageError<span class="br0">(</span><span class="kw2">Exception</span><span class="br0">)</span>:
<span class="st0">""</span><span class="st0">"Base class for errors in the email package."</span><span class="st0">""</span></pre></div>
<p>class 命名慣例適用於此,只是如果 exception 是代表錯誤時,exception class 名稱字尾要加上 'Error'。非錯誤類的 exception 不需要加特定字尾。
</p>
</blockquote>
<ul><li> 發出 exception 時,寫成 "raise ValueError('message')" 而不要用舊格式 "raise ValueError, 'message'"。
</li></ul>
<blockquote>
推薦括號格式是因為,exception 參數很長或包含格式化字串時,由於有括號,可以不必用行接續字元。舊的格式將在 Python 3000 (譯註:3.0)中移除。
</blockquote>
<ul><li> 捕捉 exception 時,盡可能註明特定的 exception 而不要只用空的 'except:' 子句。
</li></ul>
<blockquote>
例如:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">try</span>:
<span class="kw1">import</span> platform_specific_module
<span class="kw1">except</span> <span class="kw2">ImportError</span>:
platform_specific_module = <span class="kw2">None</span></pre></div>
<p>空的 'except:' 子句會捕捉 SystemExit 和 KeyboardInterrupt 這兩個 exception,造成 Control-C 無法中止程式,而且可能掩蓋住其他問題。如果想捕捉所有代表程式錯誤的 exception,可以用 'except Exception:'。
</p><p>有個好的法則是限制空的 'except' 子句只能用在兩種情況:
</p>
<ol><li> exception 會被印出或記錄,至少使用者能注意到有錯誤發生。
</li><li> 程式需要做些清理工作,但之後就用 'raise' 將 exception 往上發。'try ...finally' 是處理此情況較好的方式。
</li></ol>
</blockquote>
<ul><li> 此外,對於所有 try/except 子句,將 'try' 子句的程式碼數量限制在所需的最少數量。如此也能避免掩飾住 bug。
</li></ul>
<blockquote>
這麼寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">try</span>:
value = collection<span class="br0">[</span>key<span class="br0">]</span>
<span class="kw1">except</span> <span class="kw2">KeyError</span>:
<span class="kw1">return</span> key_not_found<span class="br0">(</span>key<span class="br0">)</span>
<span class="kw1">else</span>:
<span class="kw1">return</span> handle_value<span class="br0">(</span>value<span class="br0">)</span></pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">try</span>:
<span class="co1"># Too broad! (太廣!)</span>
<span class="kw1">return</span> handle_value<span class="br0">(</span>collection<span class="br0">[</span>key<span class="br0">]</span><span class="br0">)</span>
<span class="kw1">except</span> <span class="kw2">KeyError</span>:
<span class="co1"># Will also catch KeyError raised by handle_value()</span>
<span class="co1"># (也會捕捉到 handle_value() 發出的 KeyError)</span>
<span class="kw1">return</span> key_not_found<span class="br0">(</span>key<span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 用字串的 method 而不要用 string module 的 function。
</li></ul>
<blockquote>
字串的 method 總是快得多,而且和 unicode 字串共用同樣的 API。需要相容於比 Python 2.0 舊的版本時,可以打破此規則。
</blockquote>
<ul><li> 用 ''.startswith() 和 ''.endswith() 比對字串的字首和字尾,而不要用字串 slice。
</li></ul>
<blockquote>
startswith() 和 endswith() 更清楚明白且不容易出錯。例如:
<br />
這麼寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo.<span class="me1">startswith</span><span class="br0">(</span><span class="st0">'bar'</span><span class="br0">)</span>:</pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> foo<span class="br0">[</span>:<span class="nu0">3</span><span class="br0">]</span> == <span class="st0">'bar'</span>:</pre></div>
<p>唯一例外是你的程式碼必須在 Python 1.5.2 運行(希望不要)。
</p>
</blockquote>
<ul><li> 比較物件型別應該永遠用 isinstance() 而不要直接比較型別。
</li></ul>
<blockquote>
這麼寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> <span class="kw2">isinstance</span><span class="br0">(</span>obj, <span class="kw2">int</span><span class="br0">)</span>:</pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> <span class="kw2">type</span><span class="br0">(</span>obj<span class="br0">)</span> <span class="kw1">is</span> <span class="kw2">type</span><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>:</pre></div>
<p>檢查物件是不是字串的時候,別忘了它也可能是 unicode 字串!Python 2.3 中,str 和 unicode 有共同的 base class -- basestring,所以可以這樣寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> <span class="kw2">isinstance</span><span class="br0">(</span>obj, <span class="kw2">basestring</span><span class="br0">)</span>:</pre></div>
<p>Python 2.2 中,types module 裡為此用途定義了 StringTypes 型別:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">from</span> <span class="kw3">types</span> <span class="kw1">import</span> StringTypes
<span class="kw1">if</span> <span class="kw2">isinstance</span><span class="br0">(</span>obj, StringTypes<span class="br0">)</span>:</pre></div>
<p>Python 2.0 和 2.1 中,應該這麼寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">from</span> <span class="kw3">types</span> <span class="kw1">import</span> StringType, UnicodeType
<span class="kw1">if</span> <span class="kw2">isinstance</span><span class="br0">(</span>obj, StringType<span class="br0">)</span> <span class="kw1">or</span> \
<span class="kw2">isinstance</span><span class="br0">(</span>obj, UnicodeType<span class="br0">)</span> :</pre></div>
</blockquote>
<ul><li> 對於序列(string, list, tuple),利用空序列代表 false 的特性
</li></ul>
<blockquote>
這麼寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> <span class="kw1">not</span> seq:
<span class="kw1">if</span> seq:</pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> <span class="kw2">len</span><span class="br0">(</span>seq<span class="br0">)</span>
<span class="kw1">if</span> <span class="kw1">not</span> <span class="kw2">len</span><span class="br0">(</span>seq<span class="br0">)</span></pre></div>
</blockquote>
<ul><li> 不要寫出尾端需要有大量空白的字串常量。這些尾端的空白視覺上不易辨別,而且有些編輯器(或者像是 reindent.py)會將它們刪除。
</li></ul>
<ul><li> 不要將邏輯值用 == 去和 True 或 False 比較
</li></ul>
<blockquote>
這麼寫:
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> greeting:</pre></div>
<p>不要寫:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> greeting == <span class="kw2">True</span>:</pre></div>
<p>更不要:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-python"><span class="kw1">if</span> greeting <span class="kw1">is</span> <span class="kw2">True</span>:</pre></div>
</blockquote>
<a name="References"></a><h2> <span class="mw-headline"> References </span></h2>
<dl><dd>[1] <a href="http://www.python.org/dev/peps/pep-0007" class="external text" title="http://www.python.org/dev/peps/pep-0007" rel="nofollow">PEP 7</a>, Style Guide for C Code, van Rossum
</dd></dl>
<dl><dd>[2] <a href="http://www.python.org/doc/essays/styleguide.html" class="external free" title="http://www.python.org/doc/essays/styleguide.html" rel="nofollow">http://www.python.org/doc/essays/styleguide.html</a>
</dd></dl>
<dl><dd>[3] <a href="http://www.python.org/dev/peps/pep-0257" class="external text" title="http://www.python.org/dev/peps/pep-0257" rel="nofollow">PEP 257</a>, Docstring Conventions, Goodger, van Rossum
</dd></dl>
<dl><dd>[4] <a href="http://www.wikipedia.com/wiki/CamelCase" class="external free" title="http://www.wikipedia.com/wiki/CamelCase" rel="nofollow">http://www.wikipedia.com/wiki/CamelCase</a>
</dd></dl>
<dl><dd>[5] Barry's GNU Mailman style guide <a href="http://barry.warsaw.us/software/STYLEGUIDE.txt" class="external free" title="http://barry.warsaw.us/software/STYLEGUIDE.txt" rel="nofollow">http://barry.warsaw.us/software/STYLEGUIDE.txt</a>
</dd></dl>
<dl><dd>[6] <a href="http://www.python.org/dev/peps/pep-0020" class="external text" title="http://www.python.org/dev/peps/pep-0020" rel="nofollow">PEP 20</a>, The Zen of Python
</dd></dl>
<dl><dd>[7] <a href="http://www.python.org/dev/peps/pep-0328" class="external text" title="http://www.python.org/dev/peps/pep-0328" rel="nofollow">PEP 328</a>, Imports: Multi-Line and Absolute/Relative
</dd></dl>
<!--
NewPP limit report
Preprocessor node count: 202/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
-->
<!-- Saved in parser cache with key jiayunwikinew-wiki_:pcache:idhash:12-0!1!0!!en!2!edit=0 and timestamp 20100214070530 -->
<div class="printfooter">
Retrieved from "<a href="http://wiki.jiayun.org/PEP_8_--_Style_Guide_for_Python_Code">http://wiki.jiayun.org/PEP_8_--_Style_Guide_for_Python_Code</a>"</div>
<br />
<div align="center">
<script type="text/javascript"><!--
google_ad_client = "pub-8970740405227019";
google_ad_slot = "3334618857";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<br />
<div class='mw_clear'></div>
<div id="catlinks"><p class='catlinks'><a href="/Special:Categories" title="Special:Categories">Categories</a>: <span dir='ltr'><a href="/Category:PEP" title="Category:PEP">PEP</a></span> | <span dir='ltr'><a href="/Category:Translations" title="Category:Translations">Translations</a></span></p></div> </div><!-- mw_contentholder -->
</div><!-- mw_content -->
</div><!-- mw_contentwrapper -->
<div id="mw_portlets">
<!-- other portlets -->
<div class='portlet' id='p-navigation'>
<h5>Navigation</h5>
<div class='pBody'>
<ul>
<li id="n-mainpage"><a href="/Main_Page" title="Visit the Main Page [z]" accesskey="z">Main Page</a></li>
<li id="n-portal"><a href="/JiaYun:Community_Portal" title="About the project, what you can do, where to find things">Community portal</a></li>
<li id="n-currentevents"><a href="/JiaYun:Current_events" title="Find background information on current events">Current events</a></li>
<li id="n-recentchanges"><a href="/Special:Recentchanges" title="The list of recent changes in the wiki. [r]" accesskey="r">Recent changes</a></li>
<li id="n-randompage"><a href="/Special:Random" title="Load a random page [x]" accesskey="x">Random page</a></li>
<li id="n-help"><a href="/Help:Contents" title="The place to find out.">Help</a></li>
</ul>
</div><!-- pBody -->
</div><!-- portlet -->
<!-- search -->
<div id="p-search" class="portlet">
<h5><label for="searchInput">Search</label></h5>
<div id="searchBody" class="pBody">
<form action="/Special:Search" id="searchform"><div>
<input id="searchInput" name="search" type="text" title="Search JiaYun [f]" accesskey="f" value="" />
<input type='submit' name="go" class="searchButton" id="searchGoButton" value="Go" title="Go to a page with this exact name if exists" />
<input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="Search" title="Search the pages for this text" />
</div></form>
</div><!-- pBody -->
</div><!-- portlet -->
<!-- toolbox -->
<div class="portlet" id="p-tb">
<h5>Toolbox</h5>
<div class="pBody">
<ul>
<li id="t-whatlinkshere"><a href="/Special:Whatlinkshere/PEP_8_--_Style_Guide_for_Python_Code" title="List of all wiki pages that link here [j]" accesskey="j">What links here</a></li>
<li id="t-recentchangeslinked"><a href="/Special:Recentchangeslinked/PEP_8_--_Style_Guide_for_Python_Code" title="Recent changes in pages linked from this page [k]" accesskey="k">Related changes</a></li>
<li id="t-upload"><a href="/Special:Upload" title="Upload files [u]" accesskey="u">Upload file</a></li>
<li id="t-specialpages"><a href="/Special:Specialpages" title="List of all special pages [q]" accesskey="q">Special pages</a></li>
<li id="t-print"><a href="/index.php?title=PEP_8_--_Style_Guide_for_Python_Code&printable=yes" title="Printable version of this page [p]" accesskey="p">Printable version</a></li> <li id="t-permalink"><a href="/index.php?title=PEP_8_--_Style_Guide_for_Python_Code&oldid=78" title="Permanent link to this version of the page">Permanent link</a></li> </ul>
</div><!-- pBody -->
</div><!-- portlet -->
<!-- languages -->
</div><!-- mw_portlets -->
</div><!-- main -->
<div class="mw_clear"></div>
<!-- personal portlet -->
<div class="portlet" id="p-personal">
<h5>Personal tools</h5>
<div class="pBody">
<ul>
<li id="pt-login"><a href="/index.php?title=Special:Userlogin&returnto=PEP_8_--_Style_Guide_for_Python_Code" title="You are encouraged to log in, it is not mandatory however. [o]" accesskey="o">Log in / create account</a></li>
</ul>
</div>
</div>
<!-- footer -->
<div id="footer">
<ul id="f-list">
<li id="lastmod"> This page was last modified 09:53, 7 May 2008.</li>
<li id="viewcount">This page has been accessed 19,803 times.</li>
<li id="copyright">Content is available under <a href="http://creativecommons.org/licenses/by-nc-nd/3.0/" class="external " title="http://creativecommons.org/licenses/by-nc-nd/3.0/" rel="nofollow">Attribution-Noncommercial-No Derivative Works 3.0 Unported</a>.</li>
<li id="copyrightico"><a href="http://creativecommons.org/licenses/by-nc-nd/3.0/"><img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" alt='Attribution-Noncommercial-No Derivative Works 3.0 Unported' /></a></li>
<li id="about"><a href="/JiaYun:About" title="JiaYun:About">About JiaYun</a></li>
</ul>
</div>
<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
<!-- Served in 0.305 secs. --></body></html>