Bob Klahn
2008-01-03 05:52:31 UTC
Here's a character-filter-generating function (a minor variation
of a recipe in "Python Cookbook" section 1.10) that I'm using in one
of my applications:
def makefilter( chars, delete=True ):
"""
Given a string of plain characters to (a) keep or (b) delete,
build a filtering function that, applied to any string s,
returns a copy of s containing
(a) only the characters to be kept, or
(b) all but the characters to be deleted.
"""
import string
allchars = string.maketrans('','')
if delete: delchars = chars
else: delchars = allchars.translate(allchars, chars)
def thefilter(s):
return s.translate(allchars, delchars)
return thefilter
I'm using the above function inside a wx.grid cell renderer:
class CellRenderer(gridlib.PyGridCellRenderer):
def __init__(self):
gridlib.PyGridCellRenderer.__init__(self)
self.filter = utils.makefilter('{}\x08\x0C',delete=True)
The problem: When the cell renderer executes and the filter is
invoked (e.g., as self.filter(word) ), it fails on the
return s.translate(allchars, delchars)
line in makefilter:
TypeError: translate() takes exactly one argument (2 given)
I.e, Python thinks that string s is a Unicode string. But I'm not
using Unicode strings anywhere! Any ideas where wxPython might be
changing my plain strings into Unicode strings? I'm not able to
provide a simple code example.
Filters generated by makefilter work perfectly outside of my wxPython
application.
Bob
of a recipe in "Python Cookbook" section 1.10) that I'm using in one
of my applications:
def makefilter( chars, delete=True ):
"""
Given a string of plain characters to (a) keep or (b) delete,
build a filtering function that, applied to any string s,
returns a copy of s containing
(a) only the characters to be kept, or
(b) all but the characters to be deleted.
"""
import string
allchars = string.maketrans('','')
if delete: delchars = chars
else: delchars = allchars.translate(allchars, chars)
def thefilter(s):
return s.translate(allchars, delchars)
return thefilter
I'm using the above function inside a wx.grid cell renderer:
class CellRenderer(gridlib.PyGridCellRenderer):
def __init__(self):
gridlib.PyGridCellRenderer.__init__(self)
self.filter = utils.makefilter('{}\x08\x0C',delete=True)
The problem: When the cell renderer executes and the filter is
invoked (e.g., as self.filter(word) ), it fails on the
return s.translate(allchars, delchars)
line in makefilter:
TypeError: translate() takes exactly one argument (2 given)
I.e, Python thinks that string s is a Unicode string. But I'm not
using Unicode strings anywhere! Any ideas where wxPython might be
changing my plain strings into Unicode strings? I'm not able to
provide a simple code example.
Filters generated by makefilter work perfectly outside of my wxPython
application.
Bob