The usual.

This commit is contained in:
Guido van Rossum 1999-02-09 18:40:13 +00:00
parent 01b7ced834
commit 2e7840fe8f
4 changed files with 131 additions and 71 deletions

View File

@ -24,34 +24,37 @@ ConfigParser -- responsible for for parsing a list of
methods:
__init__(defaults=None) -- create the parser and specify a
dictionary of intrinsic defaults. The
keys must be strings, the values must
be appropriate for %()s string
interpolation. Note that `__name__' is
always an intrinsic default; it's value
is the section's name.
__init__(defaults=None)
create the parser and specify a dictionary of intrinsic defaults. The
keys must be strings, the values must be appropriate for %()s string
interpolation. Note that `__name__' is always an intrinsic default;
it's value is the section's name.
sections() -- return all the configuration section names, sans DEFAULT
sections()
return all the configuration section names, sans DEFAULT
options(section) -- return list of configuration options for the named
section
options(section)
return list of configuration options for the named section
read(*filenames) -- read and parse the list of named configuration files
read(filenames)
read and parse the list of named configuration files
get(section, option, raw=0) -- return a string value for the named
option. All % interpolations are
expanded in the return values, based on
the defaults passed into the constructor
and the DEFAULT section.
get(section, option, raw=0, vars=None)
return a string value for the named option. All % interpolations are
expanded in the return values, based on the defaults passed into the
constructor and the DEFAULT section. Additional substitutions may be
provided using the `vars' argument, which must be a dictionary whose
contents override any pre-existing defaults.
getint(section, options) -- like get(), but convert value to an integer
getint(section, options)
like get(), but convert value to an integer
getfloat(section, options) -- like get(), but convert value to a float
getfloat(section, options)
like get(), but convert value to a float
getboolean(section, options) -- like get(), but convert value to
a boolean (currently defined as 0
or 1, only)
getboolean(section, options)
like get(), but convert value to a boolean (currently defined as 0 or
1, only)
"""
import sys
@ -173,12 +176,14 @@ class ConfigParser:
except IOError:
pass
def get(self, section, option, raw=0):
def get(self, section, option, raw=0, vars=None):
"""Get an option value for a given section.
All % interpolations are expanded in the return values, based
on the defaults passed into the constructor, unless the optional
argument `raw' is true.
All % interpolations are expanded in the return values, based on the
defaults passed into the constructor, unless the optional argument
`raw' is true. Additional substitutions may be provided using the
`vars' argument, which must be a dictionary whose contents overrides
any pre-existing defaults.
The section DEFAULT is special.
"""
@ -191,6 +196,9 @@ class ConfigParser:
raise NoSectionError(section)
d = self.__defaults.copy()
d.update(sectdict)
# Update with the entry specific variables
if vars:
d.update(vars)
option = string.lower(option)
try:
rawval = d[option]
@ -199,11 +207,17 @@ class ConfigParser:
# do the string interpolation
if raw:
return rawval
try:
return rawval % d
except KeyError, key:
raise InterpolationError(key, option, section, rawval)
value = rawval # Make it a pretty variable name
while 1: # Loop through this until it's done
if not string.find(value, "%("):
try:
value = value % d
except KeyError, key:
raise InterpolationError(key, option, section, rawval)
else:
return value
def __get(self, section, conv, option):
return conv(self.get(section, option))

View File

@ -367,3 +367,10 @@ def normpath(path):
if not comps and not slashes:
comps.append('.')
return slashes + string.joinfields(comps, '/')
# Return an absolute path.
def abspath(path):
if not isabs(path):
path = join(os.getcwd(), path)
return normpath(path)

View File

@ -5,9 +5,14 @@
try:
class Empty(Exception):
pass
class Full(Exception):
pass
except TypeError:
# string based exceptions
Empty = 'Queue.Empty' # Exception raised by get_nowait()
# exception raised by get(block=0)/get_nowait()
Empty = 'Queue.Empty'
# exception raised by put(block=0)/put_nowait()
Full = 'Queue.Full'
class Queue:
def __init__(self, maxsize):
@ -23,32 +28,38 @@ class Queue:
self.fsema = thread.allocate_lock()
def qsize(self):
"""Returns the approximate size of the queue (not reliable!)."""
"""Return the approximate size of the queue (not reliable!)."""
self.mutex.acquire()
n = self._qsize()
self.mutex.release()
return n
def empty(self):
"""Returns 1 if the queue is empty, 0 otherwise (not reliable!)."""
"""Return 1 if the queue is empty, 0 otherwise (not reliable!)."""
self.mutex.acquire()
n = self._empty()
self.mutex.release()
return n
def full(self):
"""Returns 1 if the queue is full, 0 otherwise (not reliable!)."""
"""Return 1 if the queue is full, 0 otherwise (not reliable!)."""
self.mutex.acquire()
n = self._full()
self.mutex.release()
return n
def put(self, item):
def put(self, item, block=1):
"""Put an item into the queue.
If the queue is full, block until a free slot is avaiable.
"""
self.fsema.acquire()
If optional arg 'block' is 1 (the default), block if
necessary until a free slot is available. Otherwise (block
is 0), put an item on the queue if a free slot is immediately
available, else raise the Full exception.
"""
if block:
self.fsema.acquire()
elif not self.fsema.acquire(0):
raise Full
self.mutex.acquire()
was_empty = self._empty()
self._put(item)
@ -58,45 +69,27 @@ class Queue:
self.fsema.release()
self.mutex.release()
def get(self):
"""Gets and returns an item from the queue.
def put_nowait(self, item):
"""Put an item into the queue without blocking.
This method blocks if necessary until an item is available.
Only enqueue the item if a free slot is immediately available.
Otherwise raise the Full exception.
"""
self.esema.acquire()
self.mutex.acquire()
was_full = self._full()
item = self._get()
if was_full:
self.fsema.release()
if not self._empty():
self.esema.release()
self.mutex.release()
return item
return self.put(item, 0)
# Get an item from the queue if one is immediately available,
# raise Empty if the queue is empty or temporarily unavailable
def get_nowait(self):
"""Gets and returns an item from the queue.
def get(self, block=1):
"""Remove and return an item from the queue.
Only gets an item if one is immediately available, Otherwise
this raises the Empty exception if the queue is empty or
temporarily unavailable.
If optional arg 'block' is 1 (the default), block if
necessary until an item is available. Otherwise (block is 0),
return an item if one is immediately available, else raise the
Empty exception.
"""
locked = self.esema.acquire(0)
self.mutex.acquire()
if self._empty():
# The queue is empty -- we can't have esema
self.mutex.release()
if block:
self.esema.acquire()
elif not self.esema.acquire(0):
raise Empty
if not locked:
locked = self.esema.acquire(0)
if not locked:
# Somebody else has esema
# but we have mutex --
# go out of their way
self.mutex.release()
raise Empty
self.mutex.acquire()
was_full = self._full()
item = self._get()
if was_full:
@ -106,8 +99,13 @@ class Queue:
self.mutex.release()
return item
# XXX Need to define put_nowait() as well.
def get_nowait(self):
"""Remove and return an item from the queue without blocking.
Only get an item if one is immediately available. Otherwise
raise the Empty exception.
"""
return self.get(0)
# Override these methods to implement other queue organizations
# (e.g. stack or priority queue).

41
Lib/dos-8x3/test_ntp.py Normal file
View File

@ -0,0 +1,41 @@
import ntpath
import string
errors = 0
def tester(fn, wantResult):
fn = string.replace(fn, "\\", "\\\\")
gotResult = eval(fn)
if wantResult != gotResult:
print "error!"
print "evaluated: " + str(fn)
print "should be: " + str(wantResult)
print " returned: " + str(gotResult)
print ""
global errors
errors = errors + 1
tester('ntpath.splitdrive("c:\\foo\\bar")', ('c:', '\\foo\\bar'))
tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")', ('\\\\conky\\mountpoint', '\\foo\\bar'))
tester('ntpath.splitdrive("c:/foo/bar")', ('c:', '/foo/bar'))
tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")', ('//conky/mountpoint', '/foo/bar'))
tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")', ('\\\\conky\\mountpoint\\foo', 'bar'))
tester('ntpath.split("c:\\")', ('c:\\', ''))
tester('ntpath.split("\\\\conky\\mountpoint\\")', ('\\\\conky\\mountpoint\\', ''))
tester('ntpath.split("c:/")', ('c:/', ''))
tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
tester('ntpath.isabs("c:\\")', 1)
tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
tester('ntpath.isabs("\\foo")', 1)
tester('ntpath.isabs("\\foo\\bar")', 1)
if errors:
print str(errors) + " errors."
else:
print "No errors. Thank your lucky stars."