Mystery: wx.grid, a filter function, and Unicode

(This is the same note I sent a few minutes ago, but with a P.S.
identifying my wxPython/Python/OS versions.)

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 inmakefilter`:

` 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

P.S. I’m using wxPython 2.8.4.0 with Python 2.5.1 under Windows XP
SP2.

I may be naive here, but isn’t it possible that the error means exactly what it says: translate() takes one argument, and you’re calling it with two : `s.translate(allchars,
delchars)

`I agree that the exception’s being called a “TypeError” is a bit misleading - I would have called it a ParameterError or ArgumentError, maybe.

···

On Jan 2, 2008 10:11 PM, Bob Klahn bobklahn@comcast.net wrote:

(This is the same note I sent a few minutes ago, but with a P.S.
identifying my wxPython/Python/OS versions.)

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

P.S. I’m using wxPython 2.8.4.0 with Python 2.5.1 under Windows XP
SP2.


www.fsrtechnologies.com

No, Marc, it’s not possible. translate takes two arguments when
used with plain strings, and one argument when used with Unicode
strings.

As I said, filters generated by makefilter work perfectly
outside of my wxPython application.

Bob

···

At 01:52 AM 1/3/2008, Marc wrote:

I may be naive here, but isn’t
it possible that the error means exactly what it says: translate() takes
one argument, and you’re calling it with two : `s.translate(allchars,
delchars)

`I agree that the exception’s being called a
“TypeError” is a bit misleading - I would have called it a
ParameterError or ArgumentError, maybe.

On Jan 2, 2008 10:11 PM, Bob Klahn > bobklahn@comcast.net > wrote:
(This is the same note I sent a few minutes ago, but with a P.S.
identifying my wxPython/Python/OS versions.)

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 inmakefilter: 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

P.S. I’m using wxPython 2.8.4.0 with
Python 2.5.1 under Windows XP SP2.

www.fsrtechnologies.com

No virus found in this incoming message.

Checked by AVG Free Edition.

Version: 7.5.516 / Virus Database: 269.17.13/1207 - Release Date:
1/2/2008 11:29 AM

Bob Klahn wrote:

No, Marc, it's not possible. translate takes two arguments when used
with plain strings, and one argument when used with Unicode strings.

As I said, filters generated by makefilter work perfectly outside of my
wxPython application.

wxPython unicode handles all strings as unicode internally. I can't tell
you exactly where the conversion takes place as you didn't show the
complete grid code. I guess that even if you handle all the underlying
data in your own TableBase class, you cannot avoid to receive unicode
strings from the gui when a value has been entered in a grid cell. You
could try to convert them to string in your own SetCellValue method.
Then the GridCellRenderer should pick up the string values.

Christian