[Python-checkins] commit of r41686 - peps/trunk/pep-0008.txt
python-checkins at python.org
Wed Dec 14 23:10:17 CET 2005
Date: Wed Dec 14 23:10:16 2005
New Revision: 41686
Some additional tweakage, hopefully non-controversial.
--- peps/trunk/pep-0008.txt (original)
+++ peps/trunk/pep-0008.txt Wed Dec 14 23:10:16 2005
@@ -162,19 +162,21 @@
- Relative imports for intra-package imports are highly discouraged.
Always use the absolute package path for all imports.
+ (However, once PEP 328  is fully implemented, its style of
+ explicit relative imports will be recommended.)
- When importing a class from a class-containing module, it's usually okay
to spell this
- from MyClass import MyClass
- from foo.bar.YourClass import YourClass
+ from myclass import MyClass
+ from foo.bar.yourclass import YourClass
If this spelling causes local name clashes, then spell them
- import MyClass
- import foo.bar.YourClass
+ import myclass
+ import foo.bar.yourclass
- and use "MyClass.MyClass" and "foo.bar.YourClass.YourClass"
+ and use "myclass.MyClass" and "foo.bar.yourclass.YourClass"
Whitespace in Expressions and Statements
@@ -224,8 +226,9 @@
- Always surround these binary operators with a single space on
- either side: assignment (=), comparisons (==, <, >, !=, <>, <=,
- >=, in, not in, is, is not), Booleans (and, or, not).
+ either side: assignment (=), augmented assignment (+=, -= etc.),
+ comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
+ Booleans (and, or, not).
- Use spaces around arithmetic operators:
@@ -269,11 +272,33 @@
+ Rather not:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
+ - While sometimes it's okay to put an if/for/while with a small
+ body on the same line, never do this for multi-clause
+ statements. Also avoid folding such long lines!
+ Rather not:
+ if foo == 'blah': do_blah_thing()
+ for x in lst: total += x
+ while t < 10: t = delay()
+ Definitely not:
+ if foo == 'blah': do_blah_thing()
+ else: do_non_blah_thing()
+ try: something()
+ finally: cleanup()
+ do_one(); do_two(); do_three(long, argument,
+ list, like, this)
+ if foo == 'blah': one(); two(); three()
@@ -339,11 +364,12 @@
- PEP 257 describes good docstring conventions. Note that most
importantly, the """ that ends a multiline docstring should be on a line
- by itself, e.g.:
+ by itself, and preferably preceded by a blank line, e.g.:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
- For one liner docstrings, it's okay to keep the closing """ on the same
@@ -408,6 +434,9 @@
names together. This is not used much in Python, but it is mentioned for
completeness. For example, the os.stat() function returns a tuple whose
items traditionally have names like st_mode, st_size, st_mtime and so on.
+ (This is done to emphasize the correspondence with the fields of the
+ POSIX system call struct, which helps programmers familiar with that.)
The X11 library uses a leading X for all its public functions. In Python,
this style is generally deemed unnecessary because attribute and method
names are prefixed with an object, and function names are prefixed with a
@@ -426,11 +455,12 @@
- __double_leading_underscore: when naming a class attribute, invokes name
- mangling as of Python 1.4.
+ mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).
- __double_leading_and_trailing_underscore__: "magic" objects or
attributes that live in user-controlled namespaces. E.g. __init__,
- __import__ or __file__.
+ __import__ or __file__. Never invent such names; only use then
+ as documented.
Prescriptive: Naming Conventions
@@ -441,7 +471,7 @@
In some fonts, these characters are indistinguishable from the numerals
- one and zero. When tempted to use `l' use `L' instead.
+ one and zero. When tempted to use `l', use `L' instead.
@@ -450,14 +480,15 @@
Since module names are mapped to file names, and some file systems are
case insensitive and truncate long names, it is important that module
names be chosen to be fairly short -- this won't be a problem on Unix,
- but it may be a problem when the code is transported to Mac or Windows.
+ but it may be a problem when the code is transported to older Mac or
+ Windows versions, or DOS.
When an extension module written in C or C++ has an accompanying Python
module that provides a higher level (e.g. more object oriented)
interface, the C/C++ module has a leading underscore (e.g. _socket).
- Python packages should have short, all-lowercase names, without
+ Like module, Python packages should have short, all-lowercase names,
+ without underscores.
@@ -497,7 +528,7 @@
If a function argument's name clashes with a reserved keyword, it is
generally better to append a single trailing underscore rather than use
an abbreviation or spelling corruption. Thus "print_" is better than
+ "prnt". (Perhaps better is to avoid such clashes by using a synonym.)
Method Names and Instance Variables
@@ -565,6 +596,10 @@
Note 2: Try to keep the functional behavior side-effect free, although
side-effects such as caching are generally fine.
+ Note 3: Avoid using properties for computationally expensive
+ operations; the attribute notation makes the caller believe
+ that access is (relatively) cheap.
- If your class is intended to be subclassed, and you have attributes
that you do not want subclasses to use, consider naming them with
double leading underscores and no trailing underscores. This invokes
@@ -581,6 +616,10 @@
__getattr__(), less convenient. However the name mangling algorithm
is well documented and easy to perform manually.
+ Note 3: Not everyone likes name mangling. Try to balance the
+ need to avoid accidental name clashes with potential use by
+ advanced callers.
@@ -600,13 +639,14 @@
Also, beware of writing "if x" when you really mean "if x is not None"
-- e.g. when testing whether a variable or argument that defaults to
- None was set to some other value. The other value might be a value
- that's false in a boolean context!
+ None was set to some other value. The other value might have a type
+ (such as a container) that could be false in a boolean context!
- Use class-based exceptions.
String exceptions in new code are strongly discouraged, as they will
- eventually be deprecated and then removed.
+ eventually (in Python 2.5) be deprecated and then (in Python 3000 or
+ perhaps sooner) removed.
Modules or packages should define their own domain-specific base
exception class, which should be subclassed from the built-in Exception
@@ -686,8 +726,9 @@
- Don't compare boolean values to True or False using ==
- Yes: if greeting:
- No: if greeting == True:
+ Yes: if greeting:
+ No: if greeting == True:
+ Worse: if greeting is True:
@@ -705,6 +746,8 @@
 PEP 20, The Zen of Python
+  PEP 328, Imports: Multi-Line and Absolute/Relative
More information about the Python-checkins