diff -r 62723172412c Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/distutils/apiref.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1896,9 +1896,9 @@ that is designed to run with both Python 2.x and 3.x, add:: try: - from distutils.command.build_py import build_py_2to3 as build_py + from distutils.command.build_py import build_py_2to3 as build_py except ImportError: - from distutils.command.build_py import build_py + from distutils.command.build_py import build_py to your setup.py, and later:: diff -r 62723172412c Doc/faq/design.rst --- a/Doc/faq/design.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/faq/design.rst Sun Apr 12 00:11:57 2015 -0400 @@ -158,7 +158,7 @@ line = f.readline() if not line: break - ... # do something with line + # ... do something with line The reason for not allowing assignment in Python expressions is a common, hard-to-find bug in those other languages, caused by this construct: @@ -190,7 +190,7 @@ line = f.readline() while line: - ... # do something with line... + ... # do something with line... line = f.readline() The problem with this is that if you change your mind about exactly how you get @@ -203,7 +203,7 @@ ` support the iterator protocol, so you can write simply:: for line in f: - ... # do something with line... + ... # do something with line... @@ -577,8 +577,10 @@ class ListWrapper: def __init__(self, the_list): self.the_list = the_list + def __eq__(self, other): return self.the_list == other.the_list + def __hash__(self): l = self.the_list result = 98767 - len(l)*555 @@ -619,7 +621,7 @@ dictionary in sorted order:: for key in sorted(mydict): - ... # do whatever with mydict[key]... + ... # do whatever with mydict[key]... How do you specify and enforce an interface spec in Python? @@ -675,11 +677,11 @@ class label(Exception): pass # declare a label try: - ... - if condition: raise label() # goto label - ... + ... + if condition: raise label() # goto label + ... except label: # where to goto - pass + pass ... This doesn't allow you to jump into the middle of a loop, but that's usually diff -r 62723172412c Doc/faq/library.rst --- a/Doc/faq/library.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/faq/library.rst Sun Apr 12 00:11:57 2015 -0400 @@ -257,7 +257,8 @@ import threading, time def thread_task(name, n): - for i in range(n): print(name, i) + for i in range(n): + print(name, i) for i in range(10): T = threading.Thread(target=thread_task, args=(str(i), i)) @@ -273,7 +274,8 @@ def thread_task(name, n): time.sleep(0.001) # <--------------------! - for i in range(n): print(name, i) + for i in range(n): + print(name, i) for i in range(10): T = threading.Thread(target=thread_task, args=(str(i), i)) @@ -502,8 +504,8 @@ import struct with open(filename, "rb") as f: - s = f.read(8) - x, y, z = struct.unpack(">hhl", s) + s = f.read(8) + x, y, z = struct.unpack(">hhl", s) The '>' in the format string forces big-endian data; the letter 'h' reads one "short integer" (2 bytes), and 'l' reads one "long integer" (4 bytes) from the @@ -681,10 +683,10 @@ import urllib.request - ### build the query string + # build the query string qs = "First=Josephine&MI=Q&Last=Public" - ### connect and send the server a path + # connect and send the server a path req = urllib.request.urlopen('http://www.some-server.out-there' '/cgi-bin/some-cgi-script', data=qs) msg, hdrs = req.read(), req.info() @@ -739,8 +741,10 @@ ``/usr/sbin/sendmail``. The sendmail manual page will help you out. Here's some sample code:: + import os + SENDMAIL = "/usr/sbin/sendmail" # sendmail location - import os + p = os.popen("%s -t -i" % SENDMAIL, "w") p.write("To: receiver@example.com\n") p.write("Subject: test\n") diff -r 62723172412c Doc/faq/programming.rst --- a/Doc/faq/programming.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/faq/programming.rst Sun Apr 12 00:11:57 2015 -0400 @@ -209,7 +209,7 @@ >>> squares = [] >>> for x in range(5): - ... squares.append(lambda: x**2) + ... squares.append(lambda: x**2) This gives you a list that contains 5 lambdas that calculate ``x**2``. You might expect that, when called, they would return, respectively, ``0``, ``1``, @@ -236,7 +236,7 @@ >>> squares = [] >>> for x in range(5): - ... squares.append(lambda n=x: n**2) + ... squares.append(lambda n=x: n**2) Here, ``n=x`` creates a new variable ``n`` local to the lambda and computed when the lambda is defined so that it has the same value that ``x`` had at @@ -541,7 +541,7 @@ args['a'] = 'new-value' # args is a mutable dictionary args['b'] = args['b'] + 1 # change it in-place - args = {'a':' old-value', 'b': 99} + args = {'a': 'old-value', 'b': 99} func3(args) print(args['a'], args['b']) @@ -664,9 +664,10 @@ a = B() b = a - print(b) + + >>> print(b) <__main__.A object at 0x16D07CC> - print(a) + >>> print(a) <__main__.A object at 0x16D07CC> Arguably the class has a name: even though it is bound to two names and invoked @@ -1102,7 +1103,7 @@ Use the :func:`reversed` built-in function, which is new in Python 2.4:: for x in reversed(sequence): - ... # do something with x... + # ... do something with x ... This won't touch your original sequence, but build a new copy with reversed order to iterate over. @@ -1110,7 +1111,7 @@ With Python 2.3, you can use an extended slice syntax:: for x in sequence[::-1]: - ... # do something with x... + # ... do something with x ... How do you remove duplicates from a list? @@ -1406,7 +1407,7 @@ definition:: class C: - def meth (self, arg): + def meth(self, arg): return arg * 2 + self.attribute @@ -1439,9 +1440,9 @@ def search(obj): if isinstance(obj, Mailbox): - # ... code to search a mailbox + ... # code to search a mailbox elif isinstance(obj, Document): - # ... code to search a document + ... # code to search a document elif ... A better approach is to define a ``search()`` method on all the classes and just @@ -1449,11 +1450,11 @@ class Mailbox: def search(self): - # ... code to search a mailbox + ... # code to search a mailbox class Document: def search(self): - # ... code to search a document + ... # code to search a document obj.search() @@ -1510,7 +1511,7 @@ Use the built-in :func:`super` function:: class Derived(Base): - def meth (self): + def meth(self): super(Derived, self).meth() For version prior to 3.0, you may be using classic classes: For a class diff -r 62723172412c Doc/howto/curses.rst --- a/Doc/howto/curses.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/curses.rst Sun Apr 12 00:11:57 2015 -0400 @@ -178,8 +178,8 @@ :func:`~curses.newwin` function creates a new window of a given size, returning the new window object. :: - begin_x = 20; begin_y = 7 - height = 5; width = 40 + (begin_x, begin_y) = (20, 7) + (height, width) = (5, 40) win = curses.newwin(height, width, begin_y, begin_x) Note that the coordinate system used in curses is unusual. diff -r 62723172412c Doc/howto/descriptor.rst --- a/Doc/howto/descriptor.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/descriptor.rst Sun Apr 12 00:11:57 2015 -0400 @@ -104,7 +104,7 @@ "Emulate type_getattro() in Objects/typeobject.c" v = object.__getattribute__(self, key) if hasattr(v, '__get__'): - return v.__get__(None, self) + return v.__get__(None, self) return v The important points to remember are: @@ -163,9 +163,9 @@ self.val = val >>> class MyClass(object): - x = RevealAccess(10, 'var "x"') - y = 5 - + ... x = RevealAccess(10, 'var "x"') + ... y = 5 + ... >>> m = MyClass() >>> m.x Retrieving var "x" @@ -287,15 +287,15 @@ Running the interpreter shows how the function descriptor works in practice:: >>> class D(object): - def f(self, x): - return x - + ... def f(self, x): + ... return x + ... >>> d = D() - >>> D.__dict__['f'] # Stored internally as a function + >>> D.__dict__['f'] # Stored internally as a function - >>> D.f # Get from a class becomes an unbound method + >>> D.f # Get from a class becomes an unbound method - >>> d.f # Get from an instance becomes a bound method + >>> d.f # Get from an instance becomes a bound method > The output suggests that bound and unbound methods are two different types. @@ -358,10 +358,10 @@ calls are unexciting:: >>> class E(object): - def f(x): - print(x) - f = staticmethod(f) - + ... def f(x): + ... print(x) + ... f = staticmethod(f) + ... >>> print(E.f(3)) 3 >>> print(E().f(3)) @@ -371,23 +371,23 @@ :func:`staticmethod` would look like this:: class StaticMethod(object): - "Emulate PyStaticMethod_Type() in Objects/funcobject.c" + "Emulate PyStaticMethod_Type() in Objects/funcobject.c" - def __init__(self, f): - self.f = f + def __init__(self, f): + self.f = f - def __get__(self, obj, objtype=None): - return self.f + def __get__(self, obj, objtype=None): + return self.f Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same for whether the caller is an object or a class:: >>> class E(object): - def f(klass, x): - return klass.__name__, x - f = classmethod(f) - + ... def f(klass, x): + ... return klass.__name__, x + ... f = classmethod(f) + ... >>> print(E.f(3)) ('E', 3) >>> print(E().f(3)) @@ -419,15 +419,15 @@ :func:`classmethod` would look like this:: class ClassMethod(object): - "Emulate PyClassMethod_Type() in Objects/funcobject.c" + "Emulate PyClassMethod_Type() in Objects/funcobject.c" - def __init__(self, f): - self.f = f + def __init__(self, f): + self.f = f - def __get__(self, obj, klass=None): - if klass is None: - klass = type(obj) - def newfunc(*args): - return self.f(klass, *args) - return newfunc + def __get__(self, obj, klass=None): + if klass is None: + klass = type(obj) + def newfunc(*args): + return self.f(klass, *args) + return newfunc diff -r 62723172412c Doc/howto/functional.rst --- a/Doc/howto/functional.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/functional.rst Sun Apr 12 00:11:57 2015 -0400 @@ -395,14 +395,14 @@ continue # Skip this element for expr2 in sequence2: if not (condition2): - continue # Skip this element + continue # Skip this element ... for exprN in sequenceN: - if not (conditionN): - continue # Skip this element + if not (conditionN): + continue # Skip this element - # Output the value of - # the expression. + # Output the value of + # the expression. This means that when there are multiple ``for...in`` clauses but no ``if`` clauses, the length of the resulting output will be equal to the product of the diff -r 62723172412c Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/logging-cookbook.rst Sun Apr 12 00:11:57 2015 -0400 @@ -63,6 +63,7 @@ def __init__(self): self.logger = logging.getLogger('spam_application.auxiliary.Auxiliary') self.logger.info('creating an instance of Auxiliary') + def do_something(self): self.logger.info('doing something') a = 1 + 1 @@ -305,7 +306,7 @@ An example of using these two classes follows (imports omitted):: - que = queue.Queue(-1) # no limit on size + que = queue.Queue(-1) # no limit on size queue_handler = QueueHandler(que) handler = logging.StreamHandler() listener = QueueListener(que, handler) @@ -601,21 +602,21 @@ return True if __name__ == '__main__': - levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL) - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s') - a1 = logging.getLogger('a.b.c') - a2 = logging.getLogger('d.e.f') + levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL) + logging.basicConfig(level=logging.DEBUG, + format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s') + a1 = logging.getLogger('a.b.c') + a2 = logging.getLogger('d.e.f') - f = ContextFilter() - a1.addFilter(f) - a2.addFilter(f) - a1.debug('A debug message') - a1.info('An info message with %s', 'some parameters') - for x in range(10): - lvl = choice(levels) - lvlname = logging.getLevelName(lvl) - a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters') + f = ContextFilter() + a1.addFilter(f) + a2.addFilter(f) + a1.debug('A debug message') + a1.info('An info message with %s', 'some parameters') + for x in range(10): + lvl = choice(levels) + lvlname = logging.getLevelName(lvl) + a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters') which, when run, produces something like:: @@ -709,10 +710,10 @@ while True: try: record = queue.get() - if record is None: # We send this as a sentinel to tell the listener to quit. + if record is None: # We send this as a sentinel to tell the listener to quit. break logger = logging.getLogger(record.name) - logger.handle(record) # No level or filter logic applied - just do it! + logger.handle(record) # No level or filter logic applied - just do it! except Exception: import sys, traceback print('Whoops! Problem:', file=sys.stderr) @@ -735,10 +736,10 @@ # Note that on Windows you can't rely on fork semantics, so each process # will run the logging configuration code when it starts. def worker_configurer(queue): - h = logging.handlers.QueueHandler(queue) # Just the one handler needed + h = logging.handlers.QueueHandler(queue) # Just the one handler needed root = logging.getLogger() root.addHandler(h) - root.setLevel(logging.DEBUG) # send all messages, for demo; no other level or filter logic applied. + root.setLevel(logging.DEBUG) # send all messages, for demo; no other level or filter logic applied. # This is the worker process top-level loop, which just logs ten events with # random intervening delays before terminating. @@ -766,7 +767,7 @@ workers = [] for i in range(10): worker = multiprocessing.Process(target=worker_process, - args=(queue, worker_configurer)) + args=(queue, worker_configurer)) workers.append(worker) worker.start() for w in workers: @@ -1190,12 +1191,12 @@ of queues, for example a ZeroMQ 'publish' socket. In the example below,the socket is created separately and passed to the handler (as its 'queue'):: - import zmq # using pyzmq, the Python binding for ZeroMQ - import json # for serializing records portably + import zmq # using pyzmq, the Python binding for ZeroMQ + import json # for serializing records portably ctx = zmq.Context() - sock = zmq.Socket(ctx, zmq.PUB) # or zmq.PUSH, or other suitable value - sock.bind('tcp://*:5556') # or wherever + sock = zmq.Socket(ctx, zmq.PUB) # or zmq.PUSH, or other suitable value + sock.bind('tcp://*:5556') # or wherever class ZeroMQSocketHandler(QueueHandler): def enqueue(self, record): @@ -1233,7 +1234,7 @@ def __init__(self, uri, *handlers, **kwargs): self.ctx = kwargs.get('ctx') or zmq.Context() socket = zmq.Socket(self.ctx, zmq.SUB) - socket.setsockopt(zmq.SUBSCRIBE, '') # subscribe to everything + socket.setsockopt(zmq.SUBSCRIBE, '') # subscribe to everything socket.connect(uri) def dequeue(self): @@ -2061,7 +2062,7 @@ Format an exception so that it prints on a single line. """ result = super(OneLineExceptionFormatter, self).formatException(exc_info) - return repr(result) # or format into one line however you want to + return repr(result) # or format into one line however you want to def format(self, record): s = super(OneLineExceptionFormatter, self).format(record) diff -r 62723172412c Doc/howto/logging.rst --- a/Doc/howto/logging.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/logging.rst Sun Apr 12 00:11:57 2015 -0400 @@ -103,8 +103,8 @@ A very simple example is:: import logging - logging.warning('Watch out!') # will print a message to the console - logging.info('I told you so') # will not print anything + logging.warning('Watch out!') # will print a message to the console + logging.info('I told you so') # will not print anything If you type these lines into a script and run it, you'll see:: diff -r 62723172412c Doc/howto/regex.rst --- a/Doc/howto/regex.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/regex.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1114,19 +1114,19 @@ Here's a simple example of using the :meth:`sub` method. It replaces colour names with the word ``colour``:: - >>> p = re.compile( '(blue|white|red)') - >>> p.sub( 'colour', 'blue socks and red shoes') + >>> p = re.compile( '(blue|white|red)' ) + >>> p.sub( 'colour', 'blue socks and red shoes' ) 'colour socks and colour shoes' - >>> p.sub( 'colour', 'blue socks and red shoes', count=1) + >>> p.sub( 'colour', 'blue socks and red shoes', count=1 ) 'colour socks and red shoes' The :meth:`subn` method does the same work, but returns a 2-tuple containing the new string value and the number of replacements that were performed:: - >>> p = re.compile( '(blue|white|red)') - >>> p.subn( 'colour', 'blue socks and red shoes') + >>> p = re.compile( '(blue|white|red)' ) + >>> p.subn( 'colour', 'blue socks and red shoes' ) ('colour socks and colour shoes', 2) - >>> p.subn( 'colour', 'no colours at all') + >>> p.subn( 'colour', 'no colours at all' ) ('no colours at all', 0) Empty matches are replaced only when they're not adjacent to a previous match. diff -r 62723172412c Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/unicode.rst Sun Apr 12 00:11:57 2015 -0400 @@ -690,7 +690,7 @@ # make changes to the string 'data' with open(fname + '.new', 'w', - encoding="ascii", errors="surrogateescape") as f: + encoding="ascii", errors="surrogateescape") as f: f.write(data) The ``surrogateescape`` error handler will decode any non-ASCII bytes diff -r 62723172412c Doc/howto/urllib2.rst --- a/Doc/howto/urllib2.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/urllib2.rst Sun Apr 12 00:11:57 2015 -0400 @@ -178,9 +178,9 @@ values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python' } - headers = { 'User-Agent' : user_agent } + headers = {'User-Agent' : user_agent} - data = urllib.parse.urlencode(values) + data = urllib.parse.urlencode(values) data = data.encode('utf-8') req = urllib.request.Request(url, data, headers) response = urllib.request.urlopen(req) @@ -215,7 +215,7 @@ >>> req = urllib.request.Request('http://www.pretend_server.org') >>> try: urllib.request.urlopen(req) ... except urllib.error.URLError as e: - ... print(e.reason) #doctest: +SKIP + ... print(e.reason) #doctest: +SKIP ... (4, 'getaddrinfo failed') @@ -372,7 +372,7 @@ :: from urllib.request import Request, urlopen - from urllib.error import URLError + from urllib.error import URLError req = Request(someurl) try: response = urlopen(req) diff -r 62723172412c Doc/howto/webservers.rst --- a/Doc/howto/webservers.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/howto/webservers.rst Sun Apr 12 00:11:57 2015 -0400 @@ -295,8 +295,8 @@ yield '

FastCGI Environment

' yield '' for k, v in sorted(environ.items()): - yield ''.format( - escape(k), escape(v)) + yield ''.format( + escape(k), escape(v)) yield '
{0}{1}
{0}{1}
' WSGIServer(app).run() diff -r 62723172412c Doc/library/abc.rst --- a/Doc/library/abc.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/abc.rst Sun Apr 12 00:11:57 2015 -0400 @@ -89,8 +89,10 @@ class Foo: def __getitem__(self, index): ... + def __len__(self): ... + def get_iterator(self): return iter(self) diff -r 62723172412c Doc/library/argparse.rst --- a/Doc/library/argparse.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/argparse.rst Sun Apr 12 00:11:57 2015 -0400 @@ -35,10 +35,10 @@ parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', - help='an integer for the accumulator') + help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', - const=sum, default=max, - help='sum the integers (default: find the max)') + const=sum, default=max, + help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers)) @@ -488,7 +488,7 @@ arguments they contain. For example:: >>> with open('args.txt', 'w') as fp: - ... fp.write('-f\nbar') + ... fp.write('-f\nbar') >>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@') >>> parser.add_argument('-f') >>> parser.parse_args(['-f', 'foo', '@args.txt']) @@ -1107,9 +1107,9 @@ >>> parser = argparse.ArgumentParser(prog='frobble') >>> parser.add_argument('--foo', action='store_true', - ... help='foo the bars before frobbling') + ... help='foo the bars before frobbling') >>> parser.add_argument('bar', nargs='+', - ... help='one of the bars to be frobbled') + ... help='one of the bars to be frobbled') >>> parser.parse_args('-h'.split()) usage: frobble [-h] [--foo] bar [bar ...] @@ -1127,7 +1127,7 @@ >>> parser = argparse.ArgumentParser(prog='frobble') >>> parser.add_argument('bar', nargs='?', type=int, default=42, - ... help='the bar to %(prog)s (default: %(default)s)') + ... help='the bar to %(prog)s (default: %(default)s)') >>> parser.print_help() usage: frobble [-h] [bar] @@ -1466,10 +1466,10 @@ >>> parser = argparse.ArgumentParser() >>> parser.add_argument( ... 'integers', metavar='int', type=int, choices=range(10), - ... nargs='+', help='an integer in the range 0..9') + ... nargs='+', help='an integer in the range 0..9') >>> parser.add_argument( ... '--sum', dest='accumulate', action='store_const', const=sum, - ... default=max, help='sum the integers (default: find the max)') + ... default=max, help='sum the integers (default: find the max)') >>> parser.parse_args(['1', '2', '3', '4']) Namespace(accumulate=, integers=[1, 2, 3, 4]) >>> parser.parse_args('1 2 3 4 --sum'.split()) diff -r 62723172412c Doc/library/asynchat.rst --- a/Doc/library/asynchat.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/asynchat.rst Sun Apr 12 00:11:57 2015 -0400 @@ -202,7 +202,7 @@ self.set_terminator(None) self.handle_request() elif not self.handling: - self.set_terminator(None) # browsers sometimes over-send + self.set_terminator(None) # browsers sometimes over-send self.cgi_data = parse(self.headers, b"".join(self.ibuffer)) self.handling = True self.ibuffer = [] diff -r 62723172412c Doc/library/asyncio-sync.rst --- a/Doc/library/asyncio-sync.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/asyncio-sync.rst Sun Apr 12 00:11:57 2015 -0400 @@ -71,14 +71,14 @@ lock = Lock() ... with (yield from lock): - ... + ... Lock objects can be tested for locking state:: if not lock.locked(): - yield from lock + yield from lock else: - # lock is acquired + # lock is acquired ... .. method:: locked() diff -r 62723172412c Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/asyncore.rst Sun Apr 12 00:11:57 2015 -0400 @@ -315,8 +315,8 @@ self.buffer = self.buffer[sent:] - client = HTTPClient('www.python.org', '/') - asyncore.loop() + client = HTTPClient('www.python.org', '/') + asyncore.loop() .. _asyncore-example-2: diff -r 62723172412c Doc/library/audioop.rst --- a/Doc/library/audioop.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/audioop.rst Sun Apr 12 00:11:57 2015 -0400 @@ -276,6 +276,6 @@ # out_test) prefill = '\0'*(pos+ipos)*2 postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata)) - outputdata = prefill + audioop.mul(outputdata,2,-factor) + postfill + outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill return audioop.add(inputdata, outputdata, 2) diff -r 62723172412c Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/collections.abc.rst Sun Apr 12 00:11:57 2015 -0400 @@ -140,19 +140,22 @@ :meth:`isdisjoint`:: class ListBasedSet(collections.abc.Set): - ''' Alternate set implementation favoring space over speed - and not requiring the set elements to be hashable. ''' - def __init__(self, iterable): - self.elements = lst = [] - for value in iterable: - if value not in lst: - lst.append(value) - def __iter__(self): - return iter(self.elements) - def __contains__(self, value): - return value in self.elements - def __len__(self): - return len(self.elements) + ''' Alternate set implementation favoring space over speed + and not requiring the set elements to be hashable. ''' + def __init__(self, iterable): + self.elements = lst = [] + for value in iterable: + if value not in lst: + lst.append(value) + + def __iter__(self): + return iter(self.elements) + + def __contains__(self, value): + return value in self.elements + + def __len__(self): + return len(self.elements) s1 = ListBasedSet('abcdef') s2 = ListBasedSet('defghi') diff -r 62723172412c Doc/library/collections.rst --- a/Doc/library/collections.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/collections.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1018,7 +1018,7 @@ in conjunction with sorting to make a sorted dictionary:: >>> # regular unsorted dictionary - >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} + >>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2} >>> # dictionary sorted by key >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) diff -r 62723172412c Doc/library/concurrent.futures.rst --- a/Doc/library/concurrent.futures.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/concurrent.futures.rst Sun Apr 12 00:11:57 2015 -0400 @@ -99,12 +99,12 @@ import time def wait_on_b(): time.sleep(5) - print(b.result()) # b will never complete because it is waiting on a. + print(b.result()) # b will never complete because it is waiting on a. return 5 def wait_on_a(): time.sleep(5) - print(a.result()) # a will never complete because it is waiting on b. + print(a.result()) # a will never complete because it is waiting on b. return 6 diff -r 62723172412c Doc/library/configparser.rst --- a/Doc/library/configparser.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/configparser.rst Sun Apr 12 00:11:57 2015 -0400 @@ -833,13 +833,13 @@ # Set the optional *raw* argument of get() to True if you wish to disable # interpolation in a single get operation. - print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!" - print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!" + print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!" + print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!" # The optional *vars* argument is a dict with members that will take # precedence in interpolation. print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation', - 'baz': 'evil'})) + 'baz': 'evil'})) # The optional *fallback* argument can be used to provide a fallback value print(cfg.get('Section1', 'foo')) @@ -866,10 +866,10 @@ config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'}) config.read('example.cfg') - print(config.get('Section1', 'foo')) # -> "Python is fun!" + print(config.get('Section1', 'foo')) # -> "Python is fun!" config.remove_option('Section1', 'bar') config.remove_option('Section1', 'baz') - print(config.get('Section1', 'foo')) # -> "Life is hard!" + print(config.get('Section1', 'foo')) # -> "Life is hard!" .. _configparser-objects: diff -r 62723172412c Doc/library/contextlib.rst --- a/Doc/library/contextlib.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/contextlib.rst Sun Apr 12 00:11:57 2015 -0400 @@ -644,7 +644,7 @@ Before After >>> with cm: - ... pass + ... pass ... Traceback (most recent call last): ... diff -r 62723172412c Doc/library/crypt.rst --- a/Doc/library/crypt.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/crypt.rst Sun Apr 12 00:11:57 2015 -0400 @@ -149,4 +149,4 @@ hashed = crypt.crypt(plaintext) if not compare_hash(hashed, crypt.crypt(plaintext, hashed)): - raise ValueError("hashed version doesn't validate against original") + raise ValueError("hashed version doesn't validate against original") diff -r 62723172412c Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/ctypes.rst Sun Apr 12 00:11:57 2015 -0400 @@ -52,11 +52,11 @@ convention:: >>> from ctypes import * - >>> print(windll.kernel32) # doctest: +WINDOWS + >>> print(windll.kernel32) # doctest: +WINDOWS - >>> print(cdll.msvcrt) # doctest: +WINDOWS + >>> print(cdll.msvcrt) # doctest: +WINDOWS - >>> libc = cdll.msvcrt # doctest: +WINDOWS + >>> libc = cdll.msvcrt # doctest: +WINDOWS >>> Windows appends the usual ``.dll`` file suffix automatically. @@ -66,10 +66,10 @@ :meth:`LoadLibrary` method of the dll loaders should be used, or you should load the library by creating an instance of CDLL by calling the constructor:: - >>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX + >>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX - >>> libc = CDLL("libc.so.6") # doctest: +LINUX - >>> libc # doctest: +LINUX + >>> libc = CDLL("libc.so.6") # doctest: +LINUX + >>> libc # doctest: +LINUX >>> @@ -86,9 +86,9 @@ >>> from ctypes import * >>> libc.printf <_FuncPtr object at 0x...> - >>> print(windll.kernel32.GetModuleHandleA) # doctest: +WINDOWS + >>> print(windll.kernel32.GetModuleHandleA) # doctest: +WINDOWS <_FuncPtr object at 0x...> - >>> print(windll.kernel32.MyOwnFunction) # doctest: +WINDOWS + >>> print(windll.kernel32.MyOwnFunction) # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? File "ctypes.py", line 239, in __getattr__ @@ -117,16 +117,16 @@ identifiers, like ``"??2@YAPAXI@Z"``. In this case you have to use :func:`getattr` to retrieve the function:: - >>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") # doctest: +WINDOWS + >>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") # doctest: +WINDOWS <_FuncPtr object at 0x...> >>> On Windows, some dlls export functions not by name but by ordinal. These functions can be accessed by indexing the dll object with the ordinal number:: - >>> cdll.kernel32[1] # doctest: +WINDOWS + >>> cdll.kernel32[1] # doctest: +WINDOWS <_FuncPtr object at 0x...> - >>> cdll.kernel32[0] # doctest: +WINDOWS + >>> cdll.kernel32[0] # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? File "ctypes.py", line 310, in __getitem__ @@ -148,9 +148,9 @@ This example calls both functions with a NULL pointer (``None`` should be used as the NULL pointer):: - >>> print(libc.time(None)) # doctest: +SKIP + >>> print(libc.time(None)) # doctest: +SKIP 1150640792 - >>> print(hex(windll.kernel32.GetModuleHandleA(None))) # doctest: +WINDOWS + >>> print(hex(windll.kernel32.GetModuleHandleA(None))) # doctest: +WINDOWS 0x1d000000 >>> @@ -159,11 +159,11 @@ Windows. It does this by examining the stack after the function returns, so although an error is raised the function *has* been called:: - >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS + >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? ValueError: Procedure probably called with not enough arguments (4 bytes missing) - >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS + >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? ValueError: Procedure probably called with too many arguments (4 bytes in excess) @@ -172,13 +172,13 @@ The same exception is raised when you call an ``stdcall`` function with the ``cdecl`` calling convention, or vice versa:: - >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS + >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? ValueError: Procedure probably called with not enough arguments (4 bytes missing) >>> - >>> windll.msvcrt.printf(b"spam") # doctest: +WINDOWS + >>> windll.msvcrt.printf(b"spam") # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? ValueError: Procedure probably called with too many arguments (4 bytes in excess) @@ -191,7 +191,7 @@ crashes from general protection faults when functions are called with invalid argument values:: - >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS + >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? OSError: exception: access violation reading 0x00000020 @@ -456,9 +456,9 @@ a string pointer and a char, and returns a pointer to a string:: >>> strchr = libc.strchr - >>> strchr(b"abcdef", ord("d")) # doctest: +SKIP + >>> strchr(b"abcdef", ord("d")) # doctest: +SKIP 8059983 - >>> strchr.restype = c_char_p # c_char_p is a pointer to a string + >>> strchr.restype = c_char_p # c_char_p is a pointer to a string >>> strchr(b"abcdef", ord("d")) b'def' >>> print(strchr(b"abcdef", ord("x"))) @@ -489,17 +489,17 @@ result of this call will be used as the result of your function call. This is useful to check for error return values and automatically raise an exception:: - >>> GetModuleHandle = windll.kernel32.GetModuleHandleA # doctest: +WINDOWS + >>> GetModuleHandle = windll.kernel32.GetModuleHandleA # doctest: +WINDOWS >>> def ValidHandle(value): ... if value == 0: ... raise WinError() ... return value ... >>> - >>> GetModuleHandle.restype = ValidHandle # doctest: +WINDOWS - >>> GetModuleHandle(None) # doctest: +WINDOWS + >>> GetModuleHandle.restype = ValidHandle # doctest: +WINDOWS + >>> GetModuleHandle(None) # doctest: +WINDOWS 486539264 - >>> GetModuleHandle("something silly") # doctest: +WINDOWS + >>> GetModuleHandle("something silly") # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? File "", line 3, in ValidHandle @@ -670,12 +670,12 @@ >>> from ctypes import * >>> class POINT(Structure): - ... _fields_ = ("x", c_int), ("y", c_int) + ... _fields_ = ("x", c_int), ("y", c_int) ... >>> class MyStruct(Structure): - ... _fields_ = [("a", c_int), - ... ("b", c_float), - ... ("point_array", POINT * 4)] + ... _fields_ = [("a", c_int), + ... ("b", c_float), + ... ("point_array", POINT * 4)] >>> >>> print(len(MyStruct().point_array)) 4 @@ -992,7 +992,7 @@ The result:: - >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +LINUX + >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +LINUX py_cmp_func 5 1 py_cmp_func 33 99 py_cmp_func 7 33 @@ -1094,9 +1094,9 @@ hit the NULL entry:: >>> for item in table: - ... print(item.name, item.size) - ... if item.name is None: - ... break + ... print(item.name, item.size) + ... if item.name is None: + ... break ... __hello__ 104 __phello__ -104 diff -r 62723172412c Doc/library/email.headerregistry.rst --- a/Doc/library/email.headerregistry.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/email.headerregistry.rst Sun Apr 12 00:11:57 2015 -0400 @@ -171,7 +171,7 @@ :class:`~datetime.datetime` instance. This means, for example, that the following code is valid and does what one would expect:: - msg['Date'] = datetime(2011, 7, 15, 21) + msg['Date'] = datetime(2011, 7, 15, 21) Because this is a naive ``datetime`` it will be interpreted as a UTC timestamp, and the resulting value will have a timezone of ``-0000``. Much diff -r 62723172412c Doc/library/getopt.rst --- a/Doc/library/getopt.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/getopt.rst Sun Apr 12 00:11:57 2015 -0400 @@ -124,7 +124,7 @@ opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="]) except getopt.GetoptError as err: # print help information and exit: - print(err) # will print something like "option -a not recognized" + print(err) # will print something like "option -a not recognized" usage() sys.exit(2) output = None diff -r 62723172412c Doc/library/html.parser.rst --- a/Doc/library/html.parser.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/html.parser.rst Sun Apr 12 00:11:57 2015 -0400 @@ -51,8 +51,10 @@ class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Encountered a start tag:", tag) + def handle_endtag(self, tag): print("Encountered an end tag :", tag) + def handle_data(self, data): print("Encountered some data :", data) @@ -237,21 +239,27 @@ print("Start tag:", tag) for attr in attrs: print(" attr:", attr) + def handle_endtag(self, tag): print("End tag :", tag) + def handle_data(self, data): print("Data :", data) + def handle_comment(self, data): print("Comment :", data) + def handle_entityref(self, name): c = chr(name2codepoint[name]) print("Named ent:", c) + def handle_charref(self, name): if name.startswith('x'): c = chr(int(name[1:], 16)) else: c = chr(int(name)) print("Num ent :", c) + def handle_decl(self, data): print("Decl :", data) @@ -283,7 +291,7 @@ attr: ('type', 'text/css') Data : #python { color: green } End tag : style - >>> + >>> parser.feed('') Start tag: script diff -r 62723172412c Doc/library/http.client.rst --- a/Doc/library/http.client.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/http.client.rst Sun Apr 12 00:11:57 2015 -0400 @@ -432,7 +432,7 @@ >>> conn.request("GET", "/index.html") >>> r1 = conn.getresponse() >>> while not r1.closed: - ... print(r1.read(200)) # 200 bytes + ... print(r1.read(200)) # 200 bytes b'>> # Example of an invalid request @@ -448,7 +448,7 @@ >>> import http.client >>> conn = http.client.HTTPConnection("www.python.org") - >>> conn.request("HEAD","/index.html") + >>> conn.request("HEAD", "/index.html") >>> res = conn.getresponse() >>> print(res.status, res.reason) 200 OK diff -r 62723172412c Doc/library/inspect.rst --- a/Doc/library/inspect.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/inspect.rst Sun Apr 12 00:11:57 2015 -0400 @@ -703,7 +703,7 @@ functions:: def test(a, *, b): - ... + ... sig = signature(test) ba = sig.bind(10, b=20) diff -r 62723172412c Doc/library/ipaddress.rst --- a/Doc/library/ipaddress.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/ipaddress.rst Sun Apr 12 00:11:57 2015 -0400 @@ -653,7 +653,7 @@ example:: >>> for addr in IPv4Network('192.0.2.0/28'): - ... addr + ... addr ... IPv4Address('192.0.2.0') IPv4Address('192.0.2.1') diff -r 62723172412c Doc/library/locale.rst --- a/Doc/library/locale.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/locale.rst Sun Apr 12 00:11:57 2015 -0400 @@ -467,13 +467,13 @@ Example:: >>> import locale - >>> loc = locale.getlocale() # get current locale + >>> loc = locale.getlocale() # get current locale # use German locale; name might vary with platform >>> locale.setlocale(locale.LC_ALL, 'de_DE') - >>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut - >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale - >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale - >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale + >>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut + >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale + >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale + >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale Background, details, hints, tips and caveats diff -r 62723172412c Doc/library/mailcap.rst --- a/Doc/library/mailcap.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/mailcap.rst Sun Apr 12 00:11:57 2015 -0400 @@ -70,7 +70,7 @@ An example usage:: >>> import mailcap - >>> d=mailcap.getcaps() + >>> d = mailcap.getcaps() >>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223') ('xmpeg tmp1223', {'view': 'xmpeg %s'}) diff -r 62723172412c Doc/library/mmap.rst --- a/Doc/library/mmap.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/mmap.rst Sun Apr 12 00:11:57 2015 -0400 @@ -144,7 +144,7 @@ pid = os.fork() - if pid == 0: # In a child process + if pid == 0: # In a child process mm.seek(0) print(mm.readline()) diff -r 62723172412c Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/multiprocessing.rst Sun Apr 12 00:11:57 2015 -0400 @@ -2066,20 +2066,20 @@ return x*x if __name__ == '__main__': - with Pool(processes=4) as pool: # start 4 worker processes - result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously - print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow - - print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]" + with Pool(processes=4) as pool: # start 4 worker processes + result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously + print(result.get(timeout=1)) # prints "100" unless your computer is *very* slow + + print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]" it = pool.imap(f, range(10)) - print(next(it)) # prints "0" - print(next(it)) # prints "1" - print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow + print(next(it)) # prints "0" + print(next(it)) # prints "1" + print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow import time result = pool.apply_async(time.sleep, (10,)) - print(result.get(timeout=1)) # raises TimeoutError + print(result.get(timeout=1)) # raises TimeoutError .. _multiprocessing-listeners-clients: @@ -2538,8 +2538,8 @@ ... do something using "lock" ... if __name__ == '__main__': - lock = Lock() - for i in range(10): + lock = Lock() + for i in range(10): Process(target=f).start() should be rewritten as :: @@ -2550,8 +2550,8 @@ ... do something using "l" ... if __name__ == '__main__': - lock = Lock() - for i in range(10): + lock = Lock() + for i in range(10): Process(target=f, args=(lock,)).start() Beware of replacing :data:`sys.stdin` with a "file like object" diff -r 62723172412c Doc/library/optparse.rst --- a/Doc/library/optparse.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/optparse.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1824,9 +1824,9 @@ del parser.rargs[:len(value)] setattr(parser.values, option.dest, value) - [...] - parser.add_option("-c", "--callback", dest="vararg_attr", - action="callback", callback=vararg_callback) + [...] + parser.add_option("-c", "--callback", dest="vararg_attr", + action="callback", callback=vararg_callback) .. _optparse-extending-optparse: diff -r 62723172412c Doc/library/re.rst --- a/Doc/library/re.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/re.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1232,15 +1232,15 @@ For example:: - >>> re.match("c", "abcdef") # No match - >>> re.search("c", "abcdef") # Match + >>> re.match("c", "abcdef") # No match + >>> re.search("c", "abcdef") # Match <_sre.SRE_Match object; span=(2, 3), match='c'> Regular expressions beginning with ``'^'`` can be used with :func:`search` to restrict the match at the beginning of the string:: - >>> re.match("c", "abcdef") # No match - >>> re.search("^c", "abcdef") # No match + >>> re.match("c", "abcdef") # No match + >>> re.search("^c", "abcdef") # No match >>> re.search("^a", "abcdef") # Match <_sre.SRE_Match object; span=(0, 1), match='a'> @@ -1321,9 +1321,9 @@ in each word of a sentence except for the first and last characters:: >>> def repl(m): - ... inner_word = list(m.group(2)) - ... random.shuffle(inner_word) - ... return m.group(1) + "".join(inner_word) + m.group(3) + ... inner_word = list(m.group(2)) + ... random.shuffle(inner_word) + ... return m.group(1) + "".join(inner_word) + m.group(3) >>> text = "Professor Abdolmalek, please report your absences promptly." >>> re.sub(r"(\w)(\w+)(\w)", repl, text) 'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.' @@ -1403,14 +1403,14 @@ def tokenize(code): keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'} token_specification = [ - ('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number - ('ASSIGN', r':='), # Assignment operator - ('END', r';'), # Statement terminator - ('ID', r'[A-Za-z]+'), # Identifiers - ('OP', r'[+\-*/]'), # Arithmetic operators - ('NEWLINE', r'\n'), # Line endings - ('SKIP', r'[ \t]+'), # Skip over spaces and tabs - ('MISMATCH',r'.'), # Any other character + ('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number + ('ASSIGN', r':='), # Assignment operator + ('END', r';'), # Statement terminator + ('ID', r'[A-Za-z]+'), # Identifiers + ('OP', r'[+\-*/]'), # Arithmetic operators + ('NEWLINE', r'\n'), # Line endings + ('SKIP', r'[ \t]+'), # Skip over spaces and tabs + ('MISMATCH',r'.'), # Any other character ] tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification) line_num = 1 diff -r 62723172412c Doc/library/shelve.rst --- a/Doc/library/shelve.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/shelve.rst Sun Apr 12 00:11:57 2015 -0400 @@ -165,32 +165,33 @@ import shelve - d = shelve.open(filename) # open -- file may get suffix added by low-level - # library + d = shelve.open(filename) # open -- file may get suffix added by low-level + # library - d[key] = data # store data at key (overwrites old data if - # using an existing key) - data = d[key] # retrieve a COPY of data at key (raise KeyError if no - # such key) - del d[key] # delete data stored at key (raises KeyError - # if no such key) - flag = key in d # true if the key exists - klist = list(d.keys()) # a list of all existing keys (slow!) + d[key] = data # store data at key (overwrites old data if + # using an existing key) + data = d[key] # retrieve a COPY of data at key (raise KeyError + # if no such key) + del d[key] # delete data stored at key (raises KeyError + # if no such key) + + flag = key in d # true if the key exists + klist = list(d.keys()) # a list of all existing keys (slow!) # as d was opened WITHOUT writeback=True, beware: - d['xx'] = [0, 1, 2] # this works as expected, but... - d['xx'].append(3) # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]! + d['xx'] = [0, 1, 2] # this works as expected, but... + d['xx'].append(3) # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]! # having opened d without writeback=True, you need to code carefully: - temp = d['xx'] # extracts the copy - temp.append(5) # mutates the copy - d['xx'] = temp # stores the copy right back, to persist it + temp = d['xx'] # extracts the copy + temp.append(5) # mutates the copy + d['xx'] = temp # stores the copy right back, to persist it # or, d=shelve.open(filename,writeback=True) would let you just code # d['xx'].append(5) and have it work as expected, BUT it would also # consume more memory and make the d.close() operation slower. - d.close() # close it + d.close() # close it .. seealso:: diff -r 62723172412c Doc/library/ssl.rst --- a/Doc/library/ssl.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/ssl.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1595,7 +1595,7 @@ except ImportError: pass else: - ... # do something that requires SSL support + ... # do something that requires SSL support Client-side operation ^^^^^^^^^^^^^^^^^^^^^ diff -r 62723172412c Doc/library/string.rst --- a/Doc/library/string.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/string.rst Sun Apr 12 00:11:57 2015 -0400 @@ -234,12 +234,12 @@ Some simple format string examples:: - "First, thou shalt count to {0}" # References first positional argument - "Bring me a {}" # Implicitly references the first positional argument - "From {} to {}" # Same as "From {0} to {1}" - "My quest is {name}" # References keyword argument 'name' - "Weight in tons {0.weight}" # 'weight' attribute of first positional arg - "Units destroyed: {players[0]}" # First element of keyword argument 'players'. + "First, thou shalt count to {0}" # References first positional argument + "Bring me a {}" # Implicitly references the first positional argument + "From {} to {}" # Same as "From {0} to {1}" + "My quest is {name}" # References keyword argument 'name' + "Weight in tons {0.weight}" # 'weight' attribute of first positional arg + "Units destroyed: {players[0]}" # First element of keyword argument 'players'. The *conversion* field causes a type coercion before formatting. Normally, the job of formatting a value is done by the :meth:`__format__` method of the value diff -r 62723172412c Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/subprocess.rst Sun Apr 12 00:11:57 2015 -0400 @@ -939,25 +939,25 @@ P_NOWAIT example:: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") - ==> + # ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example:: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") - ==> + # ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example:: os.spawnvp(os.P_NOWAIT, path, args) - ==> + # ==> Popen([path] + args[1:]) Environment example:: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) - ==> + # ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) @@ -968,7 +968,7 @@ :: (child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize) - ==> + # ==> p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) @@ -978,7 +978,7 @@ (child_stdin, child_stdout, child_stderr) = os.popen3(cmd, mode, bufsize) - ==> + # ==> p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, @@ -988,7 +988,7 @@ :: (child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize) - ==> + # ==> p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) @@ -1000,7 +1000,7 @@ rc = pipe.close() if rc is not None and rc >> 8: print("There were some errors") - ==> + # ==> process = Popen(cmd, 'w', stdin=PIPE) ... process.stdin.close() @@ -1019,7 +1019,7 @@ :: (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) - ==> + # ==> p = Popen("somestring", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) @@ -1027,7 +1027,7 @@ :: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) - ==> + # ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) diff -r 62723172412c Doc/library/threading.rst --- a/Doc/library/threading.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/threading.rst Sun Apr 12 00:11:57 2015 -0400 @@ -846,7 +846,7 @@ print("hello, world") t = Timer(30.0, hello) - t.start() # after 30 seconds, "hello, world" will be printed + t.start() # after 30 seconds, "hello, world" will be printed .. class:: Timer(interval, function, args=None, kwargs=None) diff -r 62723172412c Doc/library/tkinter.rst --- a/Doc/library/tkinter.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/tkinter.rst Sun Apr 12 00:11:57 2015 -0400 @@ -206,7 +206,7 @@ self.hi_there.pack(side="top") self.QUIT = tk.Button(self, text="QUIT", fg="red", - command=root.destroy) + command=root.destroy) self.QUIT.pack(side="bottom") def say_hi(self): diff -r 62723172412c Doc/library/tokenize.rst --- a/Doc/library/tokenize.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/tokenize.rst Sun Apr 12 00:11:57 2015 -0400 @@ -201,7 +201,7 @@ we're only showing 12 digits, and the 13th isn't close to 5, the rest of the output should be platform-independent. - >>> exec(s) #doctest: +ELLIPSIS + >>> exec(s) #doctest: +ELLIPSIS -3.21716034272e-0...7 Output from calculations with Decimal should be identical across all @@ -211,9 +211,9 @@ -3.217160342717258261933904529E-7 """ result = [] - g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string - for toknum, tokval, _, _, _ in g: - if toknum == NUMBER and '.' in tokval: # replace NUMBER tokens + g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string + for toknum, tokval, _, _, _ in g: + if toknum == NUMBER and '.' in tokval: # replace NUMBER tokens result.extend([ (NAME, 'Decimal'), (OP, '('), diff -r 62723172412c Doc/library/types.rst --- a/Doc/library/types.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/types.rst Sun Apr 12 00:11:57 2015 -0400 @@ -244,10 +244,12 @@ class SimpleNamespace: def __init__(self, **kwargs): self.__dict__.update(kwargs) + def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return "{}({})".format(type(self).__name__, ", ".join(items)) + def __eq__(self, other): return self.__dict__ == other.__dict__ diff -r 62723172412c Doc/library/unittest.rst --- a/Doc/library/unittest.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/unittest.rst Sun Apr 12 00:11:57 2015 -0400 @@ -86,19 +86,19 @@ class TestStringMethods(unittest.TestCase): - def test_upper(self): - self.assertEqual('foo'.upper(), 'FOO') - - def test_isupper(self): - self.assertTrue('FOO'.isupper()) - self.assertFalse('Foo'.isupper()) - - def test_split(self): - s = 'hello world' - self.assertEqual(s.split(), ['hello', 'world']) - # check that s.split fails when the separator is not a string - with self.assertRaises(TypeError): - s.split(2) + def test_upper(self): + self.assertEqual('foo'.upper(), 'FOO') + + def test_isupper(self): + self.assertTrue('FOO'.isupper()) + self.assertFalse('Foo'.isupper()) + + def test_split(self): + s = 'hello world' + self.assertEqual(s.split(), ['hello', 'world']) + # check that s.split fails when the separator is not a string + with self.assertRaises(TypeError): + s.split(2) if __name__ == '__main__': unittest.main() diff -r 62723172412c Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/urllib.request.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1102,7 +1102,7 @@ >>> import urllib.request >>> req = urllib.request.Request(url='https://localhost/cgi-bin/test.cgi', - ... data=b'This data is passed to stdin of the CGI') + ... data=b'This data is passed to stdin of the CGI') >>> f = urllib.request.urlopen(req) >>> print(f.read().decode('utf-8')) Got Data: "This data is passed to stdin of the CGI" @@ -1117,7 +1117,7 @@ Here is an example of doing a ``PUT`` request using :class:`Request`:: import urllib.request - DATA=b'some data' + DATA = b'some data' req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT') f = urllib.request.urlopen(req) print(f.status) diff -r 62723172412c Doc/library/wsgiref.rst --- a/Doc/library/wsgiref.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/wsgiref.rst Sun Apr 12 00:11:57 2015 -0400 @@ -419,8 +419,8 @@ # Our callable object which is intentionally not compliant to the # standard, so the validator is going to break def simple_app(environ, start_response): - status = '200 OK' # HTTP Status - headers = [('Content-type', 'text/plain')] # HTTP Headers + status = '200 OK' # HTTP Status + headers = [('Content-type', 'text/plain')] # HTTP Headers start_response(status, headers) # This is going to break because we need to return a list, and @@ -762,8 +762,8 @@ # is a dictionary containing CGI-style envrironment variables and the # second variable is the callable object (see PEP 333). def hello_world_app(environ, start_response): - status = '200 OK' # HTTP Status - headers = [('Content-type', 'text/plain; charset=utf-8')] # HTTP Headers + status = '200 OK' # HTTP Status + headers = [('Content-type', 'text/plain; charset=utf-8')] # HTTP Headers start_response(status, headers) # The returned object is going to be printed diff -r 62723172412c Doc/library/xml.dom.minidom.rst --- a/Doc/library/xml.dom.minidom.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/xml.dom.minidom.rst Sun Apr 12 00:11:57 2015 -0400 @@ -30,10 +30,10 @@ from xml.dom.minidom import parse, parseString - dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name + dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name datasource = open('c:\\temp\\mydata.xml') - dom2 = parse(datasource) # parse an open file + dom2 = parse(datasource) # parse an open file dom3 = parseString('Some data some more data') diff -r 62723172412c Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/xml.etree.elementtree.rst Sun Apr 12 00:11:57 2015 -0400 @@ -94,7 +94,7 @@ It also has children nodes over which we can iterate:: >>> for child in root: - ... print(child.tag, child.attrib) + ... print(child.tag, child.attrib) ... country {'name': 'Liechtenstein'} country {'name': 'Singapore'} @@ -143,8 +143,8 @@ [('start', )] >>> parser.feed(' more text') >>> for event, elem in parser.read_events(): - ... print(event) - ... print(elem.tag, 'text=', elem.text) + ... print(event) + ... print(elem.tag, 'text=', elem.text) ... end @@ -166,7 +166,7 @@ :meth:`Element.iter`:: >>> for neighbor in root.iter('neighbor'): - ... print(neighbor.attrib) + ... print(neighbor.attrib) ... {'name': 'Austria', 'direction': 'E'} {'name': 'Switzerland', 'direction': 'W'} @@ -180,9 +180,9 @@ content. :meth:`Element.get` accesses the element's attributes:: >>> for country in root.findall('country'): - ... rank = country.find('rank').text - ... name = country.get('name') - ... print(name, rank) + ... rank = country.find('rank').text + ... name = country.get('name') + ... print(name, rank) ... Liechtenstein 1 Singapore 4 @@ -206,9 +206,9 @@ attribute to the rank element:: >>> for rank in root.iter('rank'): - ... new_rank = int(rank.text) + 1 - ... rank.text = str(new_rank) - ... rank.set('updated', 'yes') + ... new_rank = int(rank.text) + 1 + ... rank.text = str(new_rank) + ... rank.set('updated', 'yes') ... >>> tree.write('output.xml') @@ -244,9 +244,9 @@ remove all countries with a rank higher than 50:: >>> for country in root.findall('country'): - ... rank = int(country.find('rank').text) - ... if rank > 50: - ... root.remove(country) + ... rank = int(country.find('rank').text) + ... if rank > 50: + ... root.remove(country) ... >>> tree.write('output.xml') diff -r 62723172412c Doc/library/xmlrpc.client.rst --- a/Doc/library/xmlrpc.client.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/library/xmlrpc.client.rst Sun Apr 12 00:11:57 2015 -0400 @@ -211,7 +211,7 @@ from xmlrpc.server import SimpleXMLRPCServer def is_even(n): - return n%2 == 0 + return n % 2 == 0 server = SimpleXMLRPCServer(("localhost", 8000)) print("Listening on port 8000...") @@ -362,7 +362,7 @@ # A marshalling error is going to occur because we're returning a # complex number - def add(x,y): + def add(x, y): return x+y+0j server = SimpleXMLRPCServer(("localhost", 8000)) @@ -553,12 +553,15 @@ class ProxiedTransport(xmlrpc.client.Transport): def set_proxy(self, proxy): self.proxy = proxy + def make_connection(self, host): self.realhost = host h = http.client.HTTP(self.proxy) return h + def send_request(self, connection, handler, request_body): connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler)) + def send_host(self, connection, host): connection.putheader('Host', self.realhost) diff -r 62723172412c Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/reference/datamodel.rst Sun Apr 12 00:11:57 2015 -0400 @@ -1739,11 +1739,11 @@ class OrderedClass(type): - @classmethod - def __prepare__(metacls, name, bases, **kwds): + @classmethod + def __prepare__(metacls, name, bases, **kwds): return collections.OrderedDict() - def __new__(cls, name, bases, namespace, **kwds): + def __new__(cls, name, bases, namespace, **kwds): result = type.__new__(cls, name, bases, dict(namespace)) result.members = tuple(namespace) return result @@ -2226,9 +2226,9 @@ :meth:`__getattribute__` method even of the object's metaclass:: >>> class Meta(type): - ... def __getattribute__(*args): - ... print("Metaclass getattribute invoked") - ... return type.__getattribute__(*args) + ... def __getattribute__(*args): + ... print("Metaclass getattribute invoked") + ... return type.__getattribute__(*args) ... >>> class C(object, metaclass=Meta): ... def __len__(self): diff -r 62723172412c Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/reference/expressions.rst Sun Apr 12 00:11:57 2015 -0400 @@ -727,7 +727,7 @@ (and the ``**expression`` argument, if any -- see below). So:: >>> def f(a, b): - ... print(a, b) + ... print(a, b) ... >>> f(b=1, *(2,)) 2 1 diff -r 62723172412c Doc/reference/simple_stmts.rst --- a/Doc/reference/simple_stmts.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/reference/simple_stmts.rst Sun Apr 12 00:11:57 2015 -0400 @@ -331,12 +331,12 @@ The simple form, ``assert expression``, is equivalent to :: if __debug__: - if not expression: raise AssertionError + if not expression: raise AssertionError The extended form, ``assert expression1, expression2``, is equivalent to :: if __debug__: - if not expression1: raise AssertionError(expression2) + if not expression1: raise AssertionError(expression2) .. index:: single: __debug__ diff -r 62723172412c Doc/tutorial/appendix.rst --- a/Doc/tutorial/appendix.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/appendix.rst Sun Apr 12 00:11:57 2015 -0400 @@ -92,7 +92,7 @@ filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename): with open(filename) as fobj: - startup_file = fobj.read() + startup_file = fobj.read() exec(startup_file) diff -r 62723172412c Doc/tutorial/classes.rst --- a/Doc/tutorial/classes.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/classes.rst Sun Apr 12 00:11:57 2015 -0400 @@ -162,12 +162,15 @@ def scope_test(): def do_local(): spam = "local spam" + def do_nonlocal(): nonlocal spam spam = "nonlocal spam" + def do_global(): global spam spam = "global spam" + spam = "test spam" do_local() print("After local assignment:", spam) @@ -260,6 +263,7 @@ class MyClass: """A simple example class""" i = 12345 + def f(self): return 'hello world' @@ -508,8 +512,10 @@ class C: f = f1 + def g(self): return 'hello world' + h = g Now ``f``, ``g`` and ``h`` are all attributes of class :class:`C` that refer to @@ -523,8 +529,10 @@ class Bag: def __init__(self): self.data = [] + def add(self, x): self.data.append(x) + def addtwice(self, x): self.add(x) self.add(x) @@ -713,7 +721,7 @@ class Employee: pass - john = Employee() # Create an empty employee record + john = Employee() # Create an empty employee record # Fill the fields of the record john.name = 'John Doe' @@ -839,8 +847,10 @@ def __init__(self, data): self.data = data self.index = len(data) + def __iter__(self): return self + def __next__(self): if self.index == 0: raise StopIteration diff -r 62723172412c Doc/tutorial/controlflow.rst --- a/Doc/tutorial/controlflow.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/controlflow.rst Sun Apr 12 00:11:57 2015 -0400 @@ -312,7 +312,7 @@ It is simple to write a function that returns a list of the numbers of the Fibonacci series, instead of printing it:: - >>> def fib2(n): # return Fibonacci series up to n + >>> def fib2(n): # return Fibonacci series up to n ... """Return a list containing the Fibonacci series up to n.""" ... result = [] ... a, b = 0, 1 @@ -540,7 +540,7 @@ keywords rather than positional arguments. :: >>> def concat(*args, sep="/"): - ... return sep.join(args) + ... return sep.join(args) ... >>> concat("earth", "mars", "venus") 'earth/mars/venus' diff -r 62723172412c Doc/tutorial/errors.rst --- a/Doc/tutorial/errors.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/errors.rst Sun Apr 12 00:11:57 2015 -0400 @@ -170,15 +170,15 @@ raising it and add any attributes to it as desired. :: >>> try: - ... raise Exception('spam', 'eggs') + ... raise Exception('spam', 'eggs') ... except Exception as inst: - ... print(type(inst)) # the exception instance - ... print(inst.args) # arguments stored in .args - ... print(inst) # __str__ allows args to be printed directly, - ... # but may be overridden in exception subclasses - ... x, y = inst.args # unpack args - ... print('x =', x) - ... print('y =', y) + ... print(type(inst)) # the exception instance + ... print(inst.args) # arguments stored in .args + ... print(inst) # __str__ allows args to be printed directly, + ... # but may be overridden in exception subclasses + ... x, y = inst.args # unpack args + ... print('x =', x) + ... print('y =', y) ... ('spam', 'eggs') diff -r 62723172412c Doc/tutorial/inputoutput.rst --- a/Doc/tutorial/inputoutput.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/inputoutput.rst Sun Apr 12 00:11:57 2015 -0400 @@ -336,11 +336,11 @@ >>> f = open('workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 - >>> f.seek(5) # Go to the 6th byte in the file + >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' - >>> f.seek(-3, 2) # Go to the 3rd byte before the end + >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd' diff -r 62723172412c Doc/tutorial/introduction.rst --- a/Doc/tutorial/introduction.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/introduction.rst Sun Apr 12 00:11:57 2015 -0400 @@ -232,7 +232,7 @@ This feature is particularly useful when you want to break long strings:: >>> text = ('Put several strings within parentheses ' - 'to have them joined together.') + ... 'to have them joined together.') >>> text 'Put several strings within parentheses to have them joined together.' @@ -276,11 +276,11 @@ Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced. :: - >>> word[:2] # character from the beginning to position 2 (excluded) + >>> word[:2] # character from the beginning to position 2 (excluded) 'Py' - >>> word[4:] # characters from position 4 (included) to the end + >>> word[4:] # characters from position 4 (included) to the end 'on' - >>> word[-2:] # characters from the second-last (included) to the end + >>> word[-2:] # characters from the second-last (included) to the end 'on' One way to remember how slices work is to think of the indices as pointing diff -r 62723172412c Doc/tutorial/modules.rst --- a/Doc/tutorial/modules.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/modules.rst Sun Apr 12 00:11:57 2015 -0400 @@ -34,7 +34,7 @@ a, b = b, a+b print() - def fib2(n): # return Fibonacci series up to n + def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: diff -r 62723172412c Doc/tutorial/stdlib.rst --- a/Doc/tutorial/stdlib.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/stdlib.rst Sun Apr 12 00:11:57 2015 -0400 @@ -288,7 +288,7 @@ with self.assertRaises(TypeError): average(20, 30, 70) - unittest.main() # Calling from the command line invokes all tests + unittest.main() # Calling from the command line invokes all tests .. _tut-batteries-included: diff -r 62723172412c Doc/tutorial/stdlib2.rst --- a/Doc/tutorial/stdlib2.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/tutorial/stdlib2.rst Sun Apr 12 00:11:57 2015 -0400 @@ -180,6 +180,7 @@ threading.Thread.__init__(self) self.infile = infile self.outfile = outfile + def run(self): f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED) f.write(self.infile) diff -r 62723172412c Doc/whatsnew/3.2.rst --- a/Doc/whatsnew/3.2.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/whatsnew/3.2.rst Sun Apr 12 00:11:57 2015 -0400 @@ -116,7 +116,7 @@ Example of calling the parser on a command string:: - >>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain' + >>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain' >>> result = parser.parse_args(cmd.split()) >>> result.action 'deploy' @@ -212,7 +212,7 @@ >>> import json, logging.config >>> with open('conf.json') as f: - conf = json.load(f) + ... conf = json.load(f) >>> logging.config.dictConfig(conf) >>> logging.info("Transaction completed normally") INFO : root : Transaction completed normally @@ -460,15 +460,15 @@ 'The testing project status is green as of February 15, 2011' >>> class LowerCasedDict(dict): - def __getitem__(self, key): - return dict.__getitem__(self, key.lower()) + ... def __getitem__(self, key): + ... return dict.__getitem__(self, key.lower()) >>> lcd = LowerCasedDict(part='widgets', quantity=10) >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd) 'There are 10 widgets in stock' >>> class PlaceholderDict(dict): - def __missing__(self, key): - return '<{}>'.format(key) + ... def __missing__(self, key): + ... return '<{}>'.format(key) >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict()) 'Hello , welcome to ' @@ -496,10 +496,9 @@ exceptions pass through:: >>> class A: - @property - def f(self): - return 1 // 0 - + ... @property + ... def f(self): + ... return 1 // 0 >>> a = A() >>> hasattr(a, 'f') Traceback (most recent call last): @@ -537,7 +536,7 @@ def outer(x): def inner(): - return x + return x inner() del x @@ -547,12 +546,12 @@ def f(): def print_error(): - print(e) + print(e) try: - something + something except Exception as e: - print_error() - # implicit "del e" here + print_error() + # implicit "del e" here (See :issue:`4617`.) @@ -799,6 +798,7 @@ def __eq__(self, other): return ((self.lastname.lower(), self.firstname.lower()) == (other.lastname.lower(), other.firstname.lower())) + def __lt__(self, other): return ((self.lastname.lower(), self.firstname.lower()) < (other.lastname.lower(), other.firstname.lower())) @@ -942,7 +942,7 @@ def get_votes(site): ballots = conduct_election(site) try: - all_polls_closed.wait(timeout = midnight - time.now()) + all_polls_closed.wait(timeout=midnight - time.now()) except BrokenBarrierError: lockbox = seal_ballots(ballots) queue.put(lockbox) @@ -1097,16 +1097,16 @@ >>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11 >>> def change_location(buffer, record_number, location): - start = record_number * REC_LEN + LOC_START - buffer[start: start+LOC_LEN] = location + ... start = record_number * REC_LEN + LOC_START + ... buffer[start: start+LOC_LEN] = location >>> import io >>> byte_stream = io.BytesIO( - b'G3805 storeroom Main chassis ' - b'X7899 shipping Reserve cog ' - b'L6988 receiving Primary sprocket' - ) + ... b'G3805 storeroom Main chassis ' + ... b'X7899 shipping Reserve cog ' + ... b'L6988 receiving Primary sprocket' + ... ) >>> buffer = byte_stream.getbuffer() >>> change_location(buffer, 1, b'warehouse ') >>> change_location(buffer, 0, b'showroom ') @@ -1131,10 +1131,10 @@ :meth:`__repr__` and substituting a placeholder string instead:: >>> class MyList(list): - @recursive_repr() - def __repr__(self): - return '<' + '|'.join(map(repr, self)) + '>' - + ... @recursive_repr() + ... def __repr__(self): + ... return '<' + '|'.join(map(repr, self)) + '>' + >>> m = MyList('abc') >>> m.append(m) >>> m.append('x') @@ -1197,8 +1197,8 @@ >>> w.writeheader() "name","dept" >>> w.writerows([ - {'name': 'tom', 'dept': 'accounting'}, - {'name': 'susan', 'dept': 'Salesl'}]) + ... {'name': 'tom', 'dept': 'accounting'}, + ... {'name': 'susan', 'dept': 'Salesl'}]) "tom","accounting" "susan","sales" @@ -1423,14 +1423,14 @@ >>> import tarfile, glob >>> def myfilter(tarinfo): - if tarinfo.isfile(): # only save real files - tarinfo.uname = 'monty' # redact the user name - return tarinfo + ... if tarinfo.isfile(): # only save real files + ... tarinfo.uname = 'monty' # redact the user name + ... return tarinfo >>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf: - for filename in glob.glob('*.txt'): - tf.add(filename, filter=myfilter) - tf.list() + ... for filename in glob.glob('*.txt'): + ... tf.add(filename, filter=myfilter) + ... tf.list() -rw-r--r-- monty/501 902 2011-01-26 17:59:11 annotations.txt -rw-r--r-- monty/501 123 2011-01-26 17:59:11 general_questions.txt -rw-r--r-- monty/501 3514 2011-01-26 17:59:11 prion.txt @@ -1538,7 +1538,7 @@ >>> os.chdir('mydata') # change to the source directory >>> f = shutil.make_archive('/var/backup/mydata', - 'zip') # archive the current directory + ... 'zip') # archive the current directory >>> f # show the name of archive '/var/backup/mydata.zip' >>> os.chdir('tmp') # change to an unpacking @@ -1551,11 +1551,11 @@ ('zip', 'ZIP file')] >>> shutil.register_archive_format( # register a new archive format - name = 'xz', - function = xz.compress, # callable archiving function - extra_args = [('level', 8)], # arguments to the function - description = 'xz compression' - ) + ... name = 'xz', + ... function = xz.compress, # callable archiving function + ... extra_args = [('level', 8)], # arguments to the function + ... description = 'xz compression' + ... ) (Contributed by Tarek Ziadé.) @@ -1854,7 +1854,7 @@ >>> from inspect import getgeneratorstate >>> def gen(): - yield 'demo' + ... yield 'demo' >>> g = gen() >>> getgeneratorstate(g) 'GEN_CREATED' @@ -1874,10 +1874,10 @@ change state while it is searching:: >>> class A: - @property - def f(self): - print('Running') - return 10 + ... @property + ... def f(self): + ... print('Running') + ... return 10 >>> a = A() >>> getattr(a, 'f') @@ -2102,19 +2102,19 @@ >>> parser = ConfigParser() >>> parser.read_string(""" - [DEFAULT] - location = upper left - visible = yes - editable = no - color = blue - - [main] - title = Main Menu - color = green - - [options] - title = Options - """) + ... [DEFAULT] + ... location = upper left + ... visible = yes + ... editable = no + ... color = blue + ... + ... [main] + ... title = Main Menu + ... color = green + ... + ... [options] + ... title = Options + ... """) >>> parser['main']['color'] 'green' >>> parser['main']['editable'] @@ -2138,24 +2138,24 @@ >>> parser = ConfigParser(interpolation=ExtendedInterpolation()) >>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'}, - 'custom': {'prefix': '/usr/local'}}) + ... 'custom': {'prefix': '/usr/local'}}) >>> parser.read_string(""" - [buildout] - parts = - zope9 - instance - find-links = - ${buildout:directory}/downloads/dist - - [zope9] - recipe = plone.recipe.zope9install - location = /opt/zope - - [instance] - recipe = plone.recipe.zope9instance - zope9-location = ${zope9:location} - zope-conf = ${custom:prefix}/etc/zope.conf - """) + ... [buildout] + ... parts = + ... zope9 + ... instance + ... find-links = + ... ${buildout:directory}/downloads/dist + ... + ... [zope9] + ... recipe = plone.recipe.zope9install + ... location = /opt/zope + ... + ... [instance] + ... recipe = plone.recipe.zope9instance + ... zope9-location = ${zope9:location} + ... zope-conf = ${custom:prefix}/etc/zope.conf + ... """) >>> parser['buildout']['find-links'] '\n/home/ambv/zope9/downloads/dist' >>> parser['instance']['zope-conf'] @@ -2207,9 +2207,9 @@ :func:`~urllib.parse.quote_plus` for encoding:: >>> urllib.parse.urlencode([ - ('type', 'telenovela'), - ('name', '¿Dónde Está Elisa?')], - encoding='latin-1') + ... ('type', 'telenovela'), + ... ('name', '¿Dónde Está Elisa?')], + ... encoding='latin-1') 'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F' As detailed in :ref:`parsing-ascii-encoded-bytes`, all the :mod:`urllib.parse` diff -r 62723172412c Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/whatsnew/3.3.rst Sun Apr 12 00:11:57 2015 -0400 @@ -440,15 +440,15 @@ ... >>> tallies = [] >>> acc = gather_tallies(tallies) - >>> next(acc) # Ensure the accumulator is ready to accept values + >>> next(acc) # Ensure the accumulator is ready to accept values >>> for i in range(4): ... acc.send(i) ... - >>> acc.send(None) # Finish the first tally + >>> acc.send(None) # Finish the first tally >>> for i in range(5): ... acc.send(i) ... - >>> acc.send(None) # Finish the second tally + >>> acc.send(None) # Finish the second tally >>> tallies [6, 10] diff -r 62723172412c Doc/whatsnew/3.4.rst --- a/Doc/whatsnew/3.4.rst Sat Apr 11 00:31:01 2015 +0200 +++ b/Doc/whatsnew/3.4.rst Sun Apr 12 00:11:57 2015 -0400 @@ -746,7 +746,7 @@ method, equivalent to calling :mod:`~dis.dis` on the constructor argument, but returned as a multi-line string:: - >>> bytecode = dis.Bytecode(lambda x: x +1, current_offset=3) + >>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3) >>> for instr in bytecode: ... print('{} ({})'.format(instr.opname, instr.opcode)) LOAD_FAST (124)