[FAQTS] Python Knowledge Base Update -- June 28th, 2000

Fiona Czuczman fiona at sitegnome.com
Wed Jun 28 06:27:12 EDT 2000


Hi All,

Only a couple of entries entered into http://python.faqts.com today.

cheers,

Fiona


## New Entries #################################################


-------------------------------------------------------------
How can I access a method with variable amount of parameters?
http://www.faqts.com/knowledge-base/view.phtml/aid/4048
-------------------------------------------------------------
Fiona Czuczman
Remco Gerlich

You use apply(). apply(f, args) calls the function f with the arguments
given in the tuple 'args'.

To make a function that takes multiple arguments, use

def my_apply(func, *args):
   return apply(func, args)

(args is a tuple containing the values passed in).

To handle keyword arguments as well, use

def my_apply(func, *args, **kw_args):
   return apply(func, args, kw_args)
   
In this case, kw_args is a dictionary with keyword: value pairs. Just 
play around in the interpreter a bit, it's quite simple but looks 
complicated the first time you see it...


-------------------------------------------------------------
What is the best way to make multiple replacements of text strings in a file?
http://www.faqts.com/knowledge-base/view.phtml/aid/4049
-------------------------------------------------------------
Fiona Czuczman
Steve Holden, Steve Nordby,David Goodger, Fredrik Lundh

You could clean the source up a bit with:

   foobar = ( ('foo1', 'bar1'),
              ('foo2', 'bar2'),
              ('fooN', 'barN') )
   source = open(source_file,'r')
   contents = source.read()
   source.close()
 
   for foo, bar in foobar:
        contents = replace(contents, foo, bar)
 
   dest = open(dest_file, 'w')
   dest.write(contents10)
   dest.close()

For speedup, you could write the whole loop as a single statement,
but it will get horrible quickly:

   contents = replace(
                 replace(
                 replace(contents,
                 'fooN', 'barN'),
                 'foo2', 'bar2'),
                 'foo1', 'bar1)

and, of course, ths code is much less easy to maintain.

How about using a dictionary and a loop:

replaceme = {'foo1': 'bar1', 'foo2': 'bar2', 'foo3': 'bar3'}
for key in replaceme.keys():
    srch = key
    rplc = replaceme[key]
    contents = string.replace(contents, srch, rplc)

-------------------

Perhaps a bit complex for a newbie, but the most definitive answer I've 
seen so far has been Fredrik Lundh's 2000-04-12 reply to the "Python 
idiom: Multiple search-and-replace" thread:

> Is there a Python feature or standard library API that will get me 
> less Python code spinning inside this loop?   re.multisub or 
> equivalent? 

haven't benchmarked it, but I suspect that this approach is more 
efficient:

...

# based on re-example-5.py

import re
import string

symbol_map = { "foo": "FOO", "bar": "BAR" }

def symbol_replace(match, get=symbol_map.get):
    return get(match.group(1), "")

symbol_pattern = re.compile(
    "(" + string.join(map(re.escape, symbol_map.keys()), "|") + ")"
    )

print symbol_pattern.sub(symbol_replace, "foobarfiebarfoo")

...







More information about the Python-list mailing list