[FAQTS] Python Knowledge Base Update -- August 31st, 2000
Fiona Czuczman
fiona at sitegnome.com
Thu Aug 31 01:49:25 EDT 2000
Hello All,
Here are the latest entries into http://python.faqts.com
Now that the knowledge base has grown to a substantial number, 773
entries currently, my contract with FAQTS has ended. I will still hang
around, I can't be got rid of that easily :-), and add content and
maintain the resource (perhaps a little less frequently, sorry :(, if
others want to help me out in my quest that would be great.
best regards,
Fiona Czuczman
## Unanswered Questions ########################################
-------------------------------------------------------------
How to "expire" a web page with Python ?
http://www.faqts.com/knowledge-base/view.phtml/aid/5664
-------------------------------------------------------------
Quynh Nguyen Anh
## New Entries #################################################
-------------------------------------------------------------
Is there any online reference document which summarizes/discusses all Tkinter events?
http://www.faqts.com/knowledge-base/view.phtml/aid/5646
-------------------------------------------------------------
Fiona Czuczman
Fredrik Lundh
http://www.pythonware.com/library/tkinter/introduction/events-and-bindin
gs.htm briefly describes all important events.
There are more events, but they're either rather obscure, or they don't
work the same way on all platforms.
-------------------------------------------------------------
How can I convert a gif image to a bitmap representation of it?
http://www.faqts.com/knowledge-base/view.phtml/aid/5665
-------------------------------------------------------------
Fiona Czuczman
Greg Landrum
I'm not completely sure what you mean by "bitmap representation", but
PIL probably does what you want. :-)
To convert to a BMP (windows bitmap), you would do:
>>> from Pil import Image
>>> img = Image.open('foo.gif')
>>> img.save('foo.bmp')
If you would rather get a Numeric array with the values from the image:
>>> from Pil import Image
>>> from Numeric import *
>>> img = Image.open('foo.gif')
>>> arr = resize(fromstring(img.tostring(),Int8),img.size)
I hope this helps.
You can find PIL at URL:
http://www.pythonware.com/products/pil/index.htm
-------------------------------------------------------------
Is it possible to get the declaration of the argument-list of any function in the python engine? just like it is possible to get the func_name or doc-string.
http://www.faqts.com/knowledge-base/view.phtml/aid/5666
-------------------------------------------------------------
Fiona Czuczman
Alex Martelli
Yes; a very good packaging of this you can find in Lemburg's module
'hack', see http://starship.python.net/crew/lemburg/hack.py.
Don't get put off by the module's name -- it's just a collection of
"tools that I find useful to examine code from inside an interactive
interpreter session", as the author says!
The functionality you want is packaged as part of function
func_sig of this module.
It is, of course, instructive to examine exactly what this function
does. First of all:
def func_sig(func):
if hasattr(func,'im_func'):
func = func.im_func
This takes care of the case where 'func' is not really a function, but
rether a method; in this case, the real function is its attribute
im_func, so this part "normalizes" this case back to the general case.
Then:
code = func.func_code
fname = code.co_name
callargs = code.co_argcount
args = code.co_varnames[:callargs]
Now we have the function name (fname), and the arguments' names (args).
With just this part, we can already, in a sense, satisfy your request:
def func_args(func):
if hasattr(func,'im_func'):
func = func.im_func
code = func.func_code
fname = code.co_name
callargs = code.co_argcount
args = code.co_varnames[:callargs]
return "%s(%s)" % (fname, string.join(args,','))
and now for example:
>>> fa.func_args(string.join)
'join(words,sep)'
>>>
What we're still missing are the default values of arguments that do
have them -- here, for example, the fact that the 'sep' argument can
be omitted, because it defaults to space. And also, the ability of
some functions to accept unlimited lists of arguments (the *args form,
and/or **kw for keyword-arguments). Lemburg goes into slightly deeper
waters to add this information, too...:
args = list(code.co_varnames[:callargs])
...list, not tuple, because we may want to change some elements...
if func.func_defaults:
i = len(args) - len(func.func_defaults)
for default in func.func_defaults:
try:
r = repr(default)
except:
r = '<repr-error>'
if len(r) > 100:
r = r[:100] + '...'
...repr is used to get the string with which to represent the
default value, with due care for possible errors, and/or
too-long representations, which get truncated to 100 chars
(with an ellipsis ... to remind the reader they're truncated)
arg = args[i]
if arg[0] == '.':
# anonymous arguments
arg = '(...)'
args[i] = '%s=%s' % (arg,r)
i = i + 1
I don't know what "anonymous arguments" are -- I'm learning of their
very existence by studying this code (talk about instructive!-)
if code.co_flags & 0x0004: # CO_VARARGS
args.append('*'+code.co_varnames[callargs])
callargs = callargs + 1
if code.co_flags & 0x0008: # CO_VARKEYWORDS
args.append('**'+code.co_varnames[callargs])
callargs = callargs + 1
As Lemburg notes in his comments, these constants are taken right from
the Python compiler's include file.
return '%s(%s)' % (fname,string.join(args,', '))
At last -- the nicely formatted result!
>>> func_sig(string.join)
"join(words, sep=' ')"
>>>
Just one caveat: this will not work for functions written in C! The
"signature" is not available in this case by "introspection" in this
way; to see the difference:
>>> import string
>>> import strop
>>> dir(string.join)
['__doc__', '__name__', 'func_code', 'func_defaults', 'func_doc',
'func_globals', 'func_name']
>>> dir(strop.join)
['__doc__', '__name__', '__self__']
>>>
i.e., the Python-written 'string.join' wrapper offers the various
func_code, etc, members upon which this introspection can be based; the
bare-C 'strop.join' underlying level doesn't, so, no real introspection
-- you have to rely on the __doc__:
>>> print strop.join.__doc__
join(list [,sep]) -> string
joinfields(list [,sep]) -> string
Return a string composed of the words in list, with intervening
occurences of sep. Sep defaults to a single space.
(join and joinfields are synonymous)
>>>
Not too bad, after all:-).
## Edited Entries ##############################################
-------------------------------------------------------------
Is there a Python MySQL module for use under Windows?
http://www.faqts.com/knowledge-base/view.phtml/aid/4188
-------------------------------------------------------------
Fiona Czuczman, Gerhard Haering
Stefan Franke,Steve Cook
You will find a version of MySQLdb (version 0.2.1) compiled for Win32
at http://home.t-online.de/home/err666/MySQL/MySQLdb-0.2.1-windows.zip
It works fine for me connecting to MySQL 2.23/Win2k and
MySQL 2.22/Linux.
More information about the Python-list
mailing list