mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Issue #23921: Standardized documentation whitespace formatting.
Original patch by James Edwards.
This commit is contained in:
parent
387235085c
commit
dba903993a
63 changed files with 445 additions and 409 deletions
|
@ -35,10 +35,10 @@ produces either the sum or the max::
|
|||
|
||||
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 @@ specified characters will be treated as files, and will be replaced by the
|
|||
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'])
|
||||
|
@ -1109,9 +1109,9 @@ argument::
|
|||
|
||||
>>> 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'])
|
||||
usage: frobble [-h] [--foo] bar [bar ...]
|
||||
|
||||
|
@ -1129,7 +1129,7 @@ specifiers include the program name, ``%(prog)s`` and most keyword arguments to
|
|||
|
||||
>>> 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]
|
||||
|
||||
|
@ -1468,10 +1468,10 @@ interactive prompt::
|
|||
>>> 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=<built-in function max>, integers=[1, 2, 3, 4])
|
||||
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
|
||||
|
|
|
@ -202,7 +202,7 @@ any extraneous data sent by the web client are ignored. ::
|
|||
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 = []
|
||||
|
|
|
@ -71,14 +71,14 @@ Lock
|
|||
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()
|
||||
|
|
|
@ -315,8 +315,8 @@ implement its socket handling::
|
|||
self.buffer = self.buffer[sent:]
|
||||
|
||||
|
||||
client = HTTPClient('www.python.org', '/')
|
||||
asyncore.loop()
|
||||
client = HTTPClient('www.python.org', '/')
|
||||
asyncore.loop()
|
||||
|
||||
.. _asyncore-example-2:
|
||||
|
||||
|
|
|
@ -276,6 +276,6 @@ sample and subtract the whole output sample from the input sample::
|
|||
# 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)
|
||||
|
||||
|
|
|
@ -218,19 +218,22 @@ The ABC supplies the remaining methods such as :meth:`__and__` and
|
|||
: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')
|
||||
|
|
|
@ -1029,7 +1029,7 @@ Since an ordered dictionary remembers its insertion order, it can be used
|
|||
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]))
|
||||
|
|
|
@ -99,12 +99,12 @@ the results of another :class:`Future`. For example::
|
|||
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
|
||||
|
||||
|
||||
|
|
|
@ -833,13 +833,13 @@ To get interpolation, use :class:`ConfigParser`::
|
|||
|
||||
# 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 @@ interpolation if an option used is not defined elsewhere. ::
|
|||
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:
|
||||
|
|
|
@ -644,7 +644,7 @@ to yield if an attempt is made to use them a second time::
|
|||
Before
|
||||
After
|
||||
>>> with cm:
|
||||
... pass
|
||||
... pass
|
||||
...
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
|
|
|
@ -149,4 +149,4 @@ check it against the original::
|
|||
|
||||
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")
|
||||
|
|
|
@ -52,11 +52,11 @@ library containing most standard C functions, and uses the cdecl calling
|
|||
convention::
|
||||
|
||||
>>> from ctypes import *
|
||||
>>> print(windll.kernel32) # doctest: +WINDOWS
|
||||
>>> print(windll.kernel32) # doctest: +WINDOWS
|
||||
<WinDLL 'kernel32', handle ... at ...>
|
||||
>>> print(cdll.msvcrt) # doctest: +WINDOWS
|
||||
>>> print(cdll.msvcrt) # doctest: +WINDOWS
|
||||
<CDLL 'msvcrt', handle ... at ...>
|
||||
>>> libc = cdll.msvcrt # doctest: +WINDOWS
|
||||
>>> libc = cdll.msvcrt # doctest: +WINDOWS
|
||||
>>>
|
||||
|
||||
Windows appends the usual ``.dll`` file suffix automatically.
|
||||
|
@ -72,10 +72,10 @@ load a library, so attribute access can not be used to load libraries. Either th
|
|||
: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
|
||||
<CDLL 'libc.so.6', handle ... at ...>
|
||||
>>> libc = CDLL("libc.so.6") # doctest: +LINUX
|
||||
>>> libc # doctest: +LINUX
|
||||
>>> libc = CDLL("libc.so.6") # doctest: +LINUX
|
||||
>>> libc # doctest: +LINUX
|
||||
<CDLL 'libc.so.6', handle ... at ...>
|
||||
>>>
|
||||
|
||||
|
@ -92,9 +92,9 @@ Functions are accessed as attributes of dll objects::
|
|||
>>> 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 "<stdin>", line 1, in ?
|
||||
File "ctypes.py", line 239, in __getattr__
|
||||
|
@ -123,16 +123,16 @@ Sometimes, dlls export functions with names which aren't valid Python
|
|||
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 "<stdin>", line 1, in ?
|
||||
File "ctypes.py", line 310, in __getitem__
|
||||
|
@ -154,9 +154,9 @@ handle.
|
|||
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
|
||||
>>>
|
||||
|
||||
|
@ -165,11 +165,11 @@ of arguments or the wrong calling convention. Unfortunately this only works on
|
|||
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 "<stdin>", 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 "<stdin>", line 1, in ?
|
||||
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
|
||||
|
@ -178,13 +178,13 @@ although an error is raised the function *has* been called::
|
|||
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 "<stdin>", 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 "<stdin>", line 1, in ?
|
||||
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
|
||||
|
@ -197,7 +197,7 @@ On Windows, :mod:`ctypes` uses win32 structured exception handling to prevent
|
|||
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 "<stdin>", line 1, in ?
|
||||
OSError: exception: access violation reading 0x00000020
|
||||
|
@ -462,9 +462,9 @@ Here is a more advanced example, it uses the ``strchr`` function, which expects
|
|||
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")))
|
||||
|
@ -495,17 +495,17 @@ callable will be called with the *integer* the C function returns, and the
|
|||
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 "<stdin>", line 1, in ?
|
||||
File "<stdin>", line 3, in ValidHandle
|
||||
|
@ -676,12 +676,12 @@ POINTs among other stuff::
|
|||
|
||||
>>> 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
|
||||
|
@ -998,7 +998,7 @@ passed::
|
|||
|
||||
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
|
||||
|
@ -1100,9 +1100,9 @@ access violation or whatever, so it's better to break out of the loop when we
|
|||
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
|
||||
|
|
|
@ -171,7 +171,7 @@ headers.
|
|||
: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
|
||||
|
|
|
@ -124,7 +124,7 @@ In a script, typical usage is something like this::
|
|||
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
|
||||
|
|
|
@ -51,8 +51,10 @@ as they are encountered::
|
|||
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 @@ examples::
|
|||
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 @@ further parsing::
|
|||
attr: ('type', 'text/css')
|
||||
Data : #python { color: green }
|
||||
End tag : style
|
||||
>>>
|
||||
|
||||
>>> parser.feed('<script type="text/javascript">'
|
||||
... 'alert("<strong>hello!</strong>");</script>')
|
||||
Start tag: script
|
||||
|
|
|
@ -441,7 +441,7 @@ Here is an example session that uses the ``GET`` method::
|
|||
>>> conn.request("GET", "/")
|
||||
>>> r1 = conn.getresponse()
|
||||
>>> while not r1.closed:
|
||||
... print(r1.read(200)) # 200 bytes
|
||||
... print(r1.read(200)) # 200 bytes
|
||||
b'<!doctype html>\n<!--[if"...
|
||||
...
|
||||
>>> # Example of an invalid request
|
||||
|
|
|
@ -787,7 +787,7 @@ function.
|
|||
functions::
|
||||
|
||||
def test(a, *, b):
|
||||
...
|
||||
...
|
||||
|
||||
sig = signature(test)
|
||||
ba = sig.bind(10, b=20)
|
||||
|
|
|
@ -653,7 +653,7 @@ network. For iteration, *all* hosts are returned, including unusable hosts
|
|||
example::
|
||||
|
||||
>>> for addr in IPv4Network('192.0.2.0/28'):
|
||||
... addr
|
||||
... addr
|
||||
...
|
||||
IPv4Address('192.0.2.0')
|
||||
IPv4Address('192.0.2.1')
|
||||
|
|
|
@ -467,13 +467,13 @@ The :mod:`locale` module defines the following exception and functions:
|
|||
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
|
||||
|
|
|
@ -70,7 +70,7 @@ standard. However, mailcap files are supported on most Unix systems.
|
|||
An example usage::
|
||||
|
||||
>>> import mailcap
|
||||
>>> d=mailcap.getcaps()
|
||||
>>> d = mailcap.getcaps()
|
||||
>>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223')
|
||||
('xmpeg tmp1223', {'view': 'xmpeg %s'})
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
|
|||
|
||||
pid = os.fork()
|
||||
|
||||
if pid == 0: # In a child process
|
||||
if pid == 0: # In a child process
|
||||
mm.seek(0)
|
||||
print(mm.readline())
|
||||
|
||||
|
|
|
@ -2663,8 +2663,8 @@ Explicitly pass resources to child processes
|
|||
... 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 ::
|
||||
|
@ -2675,8 +2675,8 @@ Explicitly pass resources to child processes
|
|||
... 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"
|
||||
|
|
|
@ -25,7 +25,7 @@ GNU/POSIX syntax, and additionally generates usage and help messages for you.
|
|||
Here's an example of using :mod:`optparse` in a simple script::
|
||||
|
||||
from optparse import OptionParser
|
||||
[...]
|
||||
...
|
||||
parser = OptionParser()
|
||||
parser.add_option("-f", "--file", dest="filename",
|
||||
help="write report to FILE", metavar="FILE")
|
||||
|
@ -252,7 +252,7 @@ First, you need to import the OptionParser class; then, early in the main
|
|||
program, create an OptionParser instance::
|
||||
|
||||
from optparse import OptionParser
|
||||
[...]
|
||||
...
|
||||
parser = OptionParser()
|
||||
|
||||
Then you can start defining options. The basic syntax is::
|
||||
|
@ -718,7 +718,7 @@ you can call :func:`OptionParser.error` to signal an application-defined error
|
|||
condition::
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
[...]
|
||||
...
|
||||
if options.a and options.b:
|
||||
parser.error("options -a and -b are mutually exclusive")
|
||||
|
||||
|
@ -758,7 +758,7 @@ Putting it all together
|
|||
Here's what :mod:`optparse`\ -based scripts usually look like::
|
||||
|
||||
from optparse import OptionParser
|
||||
[...]
|
||||
...
|
||||
def main():
|
||||
usage = "usage: %prog [options] arg"
|
||||
parser = OptionParser(usage)
|
||||
|
@ -768,13 +768,13 @@ Here's what :mod:`optparse`\ -based scripts usually look like::
|
|||
action="store_true", dest="verbose")
|
||||
parser.add_option("-q", "--quiet",
|
||||
action="store_false", dest="verbose")
|
||||
[...]
|
||||
...
|
||||
(options, args) = parser.parse_args()
|
||||
if len(args) != 1:
|
||||
parser.error("incorrect number of arguments")
|
||||
if options.verbose:
|
||||
print("reading %s..." % options.filename)
|
||||
[...]
|
||||
...
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
@ -1409,7 +1409,7 @@ If you're not careful, it's easy to define options with conflicting option
|
|||
strings::
|
||||
|
||||
parser.add_option("-n", "--dry-run", ...)
|
||||
[...]
|
||||
...
|
||||
parser.add_option("-n", "--noisy", ...)
|
||||
|
||||
(This is particularly true if you've defined your own OptionParser subclass with
|
||||
|
@ -1450,7 +1450,7 @@ that option. If the user asks for help, the help message will reflect that::
|
|||
|
||||
Options:
|
||||
--dry-run do no harm
|
||||
[...]
|
||||
...
|
||||
-n, --noisy be noisy
|
||||
|
||||
It's possible to whittle away the option strings for a previously-added option
|
||||
|
@ -1465,7 +1465,7 @@ At this point, the original ``-n``/``--dry-run`` option is no longer
|
|||
accessible, so :mod:`optparse` removes it, leaving this help text::
|
||||
|
||||
Options:
|
||||
[...]
|
||||
...
|
||||
-n, --noisy be noisy
|
||||
--dry-run new dry-run option
|
||||
|
||||
|
@ -1701,7 +1701,7 @@ seen, but blow up if it comes after ``-b`` in the command-line. ::
|
|||
if parser.values.b:
|
||||
raise OptionValueError("can't use -a after -b")
|
||||
parser.values.a = 1
|
||||
[...]
|
||||
...
|
||||
parser.add_option("-a", action="callback", callback=check_order)
|
||||
parser.add_option("-b", action="store_true", dest="b")
|
||||
|
||||
|
@ -1719,7 +1719,7 @@ message and the flag that it sets must be generalized. ::
|
|||
if parser.values.b:
|
||||
raise OptionValueError("can't use %s after -b" % opt_str)
|
||||
setattr(parser.values, option.dest, 1)
|
||||
[...]
|
||||
...
|
||||
parser.add_option("-a", action="callback", callback=check_order, dest='a')
|
||||
parser.add_option("-b", action="store_true", dest="b")
|
||||
parser.add_option("-c", action="callback", callback=check_order, dest='c')
|
||||
|
@ -1739,7 +1739,7 @@ should not be called when the moon is full, all you have to do is this::
|
|||
raise OptionValueError("%s option invalid when moon is full"
|
||||
% opt_str)
|
||||
setattr(parser.values, option.dest, 1)
|
||||
[...]
|
||||
...
|
||||
parser.add_option("--foo",
|
||||
action="callback", callback=check_moon, dest="foo")
|
||||
|
||||
|
@ -1762,7 +1762,7 @@ Here's an example that just emulates the standard ``"store"`` action::
|
|||
|
||||
def store_value(option, opt_str, value, parser):
|
||||
setattr(parser.values, option.dest, value)
|
||||
[...]
|
||||
...
|
||||
parser.add_option("--foo",
|
||||
action="callback", callback=store_value,
|
||||
type="int", nargs=3, dest="foo")
|
||||
|
@ -1824,9 +1824,9 @@ arguments::
|
|||
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:
|
||||
|
|
|
@ -1234,15 +1234,15 @@ does by default).
|
|||
|
||||
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'>
|
||||
|
||||
|
@ -1323,9 +1323,9 @@ a function to "munge" text, or randomize the order of all the characters
|
|||
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.'
|
||||
|
@ -1405,14 +1405,14 @@ successive matches::
|
|||
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
|
||||
|
|
|
@ -165,32 +165,33 @@ object)::
|
|||
|
||||
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::
|
||||
|
|
|
@ -1585,7 +1585,7 @@ should use the following idiom::
|
|||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
... # do something that requires SSL support
|
||||
... # do something that requires SSL support
|
||||
|
||||
Client-side operation
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -234,12 +234,12 @@ does an index lookup using :func:`__getitem__`.
|
|||
|
||||
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
|
||||
|
|
|
@ -847,7 +847,7 @@ For example::
|
|||
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)
|
||||
|
|
|
@ -206,7 +206,7 @@ A Simple Hello World Program
|
|||
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):
|
||||
|
|
|
@ -201,7 +201,7 @@ objects::
|
|||
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,8 +211,8 @@ objects::
|
|||
-3.217160342717258261933904529E-7
|
||||
"""
|
||||
result = []
|
||||
g = tokenize(BytesIO(s.encode('utf-8')).readline) # tokenize the string
|
||||
for toknum, tokval, _, _, _ in g:
|
||||
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'),
|
||||
|
|
|
@ -252,10 +252,12 @@ Additional Utility Classes and Functions
|
|||
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__
|
||||
|
||||
|
|
|
@ -86,19 +86,19 @@ Here is a short script to test three string methods::
|
|||
|
||||
class TestStringMethods(unittest.TestCase):
|
||||
|
||||
def test_upper(self):
|
||||
self.assertEqual('foo'.upper(), 'FOO')
|
||||
def test_upper(self):
|
||||
self.assertEqual('foo'.upper(), 'FOO')
|
||||
|
||||
def test_isupper(self):
|
||||
self.assertTrue('FOO'.isupper())
|
||||
self.assertFalse('Foo'.isupper())
|
||||
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_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()
|
||||
|
|
|
@ -1174,7 +1174,7 @@ The code for the sample CGI used in the above example is::
|
|||
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')
|
||||
with urllib.request.urlopen(req) as f:
|
||||
pass
|
||||
|
|
|
@ -419,8 +419,8 @@ Paste" library.
|
|||
# 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 @@ This is a working "Hello World" WSGI application::
|
|||
# is a dictionary containing CGI-style environment 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
|
||||
|
|
|
@ -30,10 +30,10 @@ DOM applications typically start by parsing some XML into a DOM. With
|
|||
|
||||
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('<myxml>Some data<empty/> some more data</myxml>')
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ As an :class:`Element`, ``root`` has a tag and a dictionary of attributes::
|
|||
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 @@ elements, call :meth:`XMLPullParser.read_events`. Here is an example::
|
|||
[('start', <Element 'mytag' at 0x7fa66db2be58>)]
|
||||
>>> parser.feed(' more text</mytag>')
|
||||
>>> 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 @@ the sub-tree below it (its children, their children, and so on). For example,
|
|||
: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 @@ with a particular tag, and :attr:`Element.text` accesses the element's text
|
|||
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 @@ Let's say we want to add one to each country's rank, and add an ``updated``
|
|||
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 @@ We can remove elements using :meth:`Element.remove`. Let's say we want to
|
|||
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')
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ A working example follows. The server code::
|
|||
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...")
|
||||
|
@ -373,7 +373,7 @@ returning a complex type object. The server code::
|
|||
|
||||
# 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))
|
||||
|
@ -566,12 +566,15 @@ transport. The following example shows how:
|
|||
class ProxiedTransport(xmlrpc.client.Transport):
|
||||
def set_proxy(self, proxy):
|
||||
self.proxy = proxy
|
||||
|
||||
def make_connection(self, host):
|
||||
self.realhost = host
|
||||
h = http.client.HTTPConnection(self.proxy)
|
||||
return h
|
||||
|
||||
def send_request(self, connection, handler, request_body, debug):
|
||||
connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
|
||||
|
||||
def send_host(self, connection, host):
|
||||
connection.putheader('Host', self.realhost)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue