Initial revision
This commit is contained in:
parent
5478cc68f8
commit
eee9498b71
|
@ -0,0 +1,79 @@
|
|||
# New dir() function and other attribute-related goodies
|
||||
|
||||
# This should become a built-in function
|
||||
#
|
||||
def getattr(x, name):
|
||||
return eval('x.'+name)
|
||||
|
||||
# This should be the new dir(), except that it should still list
|
||||
# the current local name space by default
|
||||
#
|
||||
def listattrs(x):
|
||||
try:
|
||||
dictkeys = x.__dict__.keys()
|
||||
except (NameError, TypeError):
|
||||
dictkeys = []
|
||||
#
|
||||
try:
|
||||
methods = x.__methods__
|
||||
except (NameError, TypeError):
|
||||
methods = []
|
||||
#
|
||||
try:
|
||||
members = x.__members__
|
||||
except (NameError, TypeError):
|
||||
members = []
|
||||
#
|
||||
try:
|
||||
the_class = x.__class__
|
||||
except (NameError, TypeError):
|
||||
the_class = None
|
||||
#
|
||||
try:
|
||||
bases = x.__bases__
|
||||
except (NameError, TypeError):
|
||||
bases = ()
|
||||
#
|
||||
total = dictkeys + methods + members
|
||||
if the_class:
|
||||
# It's a class instace; add the class's attributes
|
||||
# that are functions (methods)...
|
||||
class_attrs = listattrs(the_class)
|
||||
class_methods = []
|
||||
for name in class_attrs:
|
||||
if is_function(getattr(the_class, name)):
|
||||
class_methods.append(name)
|
||||
total = total + class_methods
|
||||
elif bases:
|
||||
# It's a derived class; add the base class attributes
|
||||
for base in bases:
|
||||
base_attrs = listattrs(base)
|
||||
total = total + base_attrs
|
||||
total.sort()
|
||||
return total
|
||||
i = 0
|
||||
while i+1 < len(total):
|
||||
if total[i] = total[i+1]:
|
||||
del total[i+1]
|
||||
else:
|
||||
i = i+1
|
||||
return total
|
||||
|
||||
# Helper to recognize functions
|
||||
#
|
||||
def is_function(x):
|
||||
return type(x) = type(is_function)
|
||||
|
||||
# Approximation of builtin dir(); this lists the user's
|
||||
# variables by default, not the current local name space.
|
||||
# Use a class method to make a function that can be called
|
||||
# with or without arguments.
|
||||
#
|
||||
class _dirclass():
|
||||
def dir(args):
|
||||
if type(args) = type(()):
|
||||
return listattrs(args[1])
|
||||
else:
|
||||
import __main__
|
||||
return listattrs(__main__)
|
||||
dir = _dirclass().dir
|
|
@ -0,0 +1,79 @@
|
|||
# New dir() function and other attribute-related goodies
|
||||
|
||||
# This should become a built-in function
|
||||
#
|
||||
def getattr(x, name):
|
||||
return eval('x.'+name)
|
||||
|
||||
# This should be the new dir(), except that it should still list
|
||||
# the current local name space by default
|
||||
#
|
||||
def listattrs(x):
|
||||
try:
|
||||
dictkeys = x.__dict__.keys()
|
||||
except (NameError, TypeError):
|
||||
dictkeys = []
|
||||
#
|
||||
try:
|
||||
methods = x.__methods__
|
||||
except (NameError, TypeError):
|
||||
methods = []
|
||||
#
|
||||
try:
|
||||
members = x.__members__
|
||||
except (NameError, TypeError):
|
||||
members = []
|
||||
#
|
||||
try:
|
||||
the_class = x.__class__
|
||||
except (NameError, TypeError):
|
||||
the_class = None
|
||||
#
|
||||
try:
|
||||
bases = x.__bases__
|
||||
except (NameError, TypeError):
|
||||
bases = ()
|
||||
#
|
||||
total = dictkeys + methods + members
|
||||
if the_class:
|
||||
# It's a class instace; add the class's attributes
|
||||
# that are functions (methods)...
|
||||
class_attrs = listattrs(the_class)
|
||||
class_methods = []
|
||||
for name in class_attrs:
|
||||
if is_function(getattr(the_class, name)):
|
||||
class_methods.append(name)
|
||||
total = total + class_methods
|
||||
elif bases:
|
||||
# It's a derived class; add the base class attributes
|
||||
for base in bases:
|
||||
base_attrs = listattrs(base)
|
||||
total = total + base_attrs
|
||||
total.sort()
|
||||
return total
|
||||
i = 0
|
||||
while i+1 < len(total):
|
||||
if total[i] = total[i+1]:
|
||||
del total[i+1]
|
||||
else:
|
||||
i = i+1
|
||||
return total
|
||||
|
||||
# Helper to recognize functions
|
||||
#
|
||||
def is_function(x):
|
||||
return type(x) = type(is_function)
|
||||
|
||||
# Approximation of builtin dir(); this lists the user's
|
||||
# variables by default, not the current local name space.
|
||||
# Use a class method to make a function that can be called
|
||||
# with or without arguments.
|
||||
#
|
||||
class _dirclass():
|
||||
def dir(args):
|
||||
if type(args) = type(()):
|
||||
return listattrs(args[1])
|
||||
else:
|
||||
import __main__
|
||||
return listattrs(__main__)
|
||||
dir = _dirclass().dir
|
|
@ -0,0 +1,32 @@
|
|||
# Temporary file name allocation
|
||||
|
||||
import posix
|
||||
import path
|
||||
|
||||
|
||||
# Changeable parameters (by clients!)...
|
||||
# XXX Should the environment variable $TMPDIR override tempdir?
|
||||
|
||||
tempdir = '/usr/tmp'
|
||||
template = '@'
|
||||
|
||||
|
||||
# Kludge to hold mutable state
|
||||
|
||||
class Struct(): pass
|
||||
G = Struct()
|
||||
G.i = 0
|
||||
|
||||
|
||||
# User-callable function
|
||||
# XXX Should this have a parameter, like C's mktemp()?
|
||||
# XXX Should we instead use the model of Standard C's tempnam()?
|
||||
# XXX By all means, avoid a mess with four different functions like C...
|
||||
|
||||
def mktemp():
|
||||
while 1:
|
||||
G.i = G.i+1
|
||||
file = tempdir +'/'+ template + `posix.getpid()` +'.'+ `G.i`
|
||||
if not path.exists(file):
|
||||
break
|
||||
return file
|
Loading…
Reference in New Issue