Using String Methods In Jump Tables
Chris Rebert
clp2 at rebertia.com
Thu Aug 19 19:41:27 EDT 2010
On Thu, Aug 19, 2010 at 4:27 PM, Tim Daneliuk <tundra at tundraware.com> wrote:
> Problem:
>
> Given tuples in the form (key, string), use 'key' to determine
> what string method to apply to the string:
>
> key operation
> -----------------------
>
> l lower()
> u upper()
> t title()
> ...
>
> Commentary:
>
> Easy, right? Well ... except that I would really, really like
> to avoid cascading ifs or eval based solutions. I'd like to implement
> this as a jump table dictionary:
>
> jt = { 'l' : lower_function reference,
> 'u' : upper_function reference,
> ...
> }
>
> So I could then do this:
>
> string = jt[key](string)
>
> But There's A Problem:
>
> I tried to do this:
>
> jt = {'l', "".lower,
> 'u', "".upper,
> ...
> }
>
> You can get away with this because all string objects appear to point to common
> method objects. That is,: id("a".lower) == id("b".lower)
>
> HOWEVER, you cannot then do this:
>
> string = jt[key](string)
>
> Why? Because the methods of a string, while common to all strings
> *do not accept an arg*. They are implemented to "know" about the
> string instance they "belong to" (that contains them).
Right; by looking the method up on an instance you get a "bound"
method that is "bound" to the instance you got it from and already has
self filled-in.
> (Forgive me here, I am probably not using some of the OO arcana properly...)
>
<snip>
>
> How do you get a reference to a method found in one object instance, but
> actually apply it to another instance of the same class? I'm guessing this may
> involve fiddling with some of the internal __ variables, but I'm not
> quite sure where to go next.
You must access the method from the class rather than the instance;
this produces an "unbound" method that is not bound to a specific
instance and does not have self already filled-in.
In your dictionary, replace "".lower with str.lower, and so on for the
other methods.
Cheers,
Chris
--
http://blog.rebertia.com
More information about the Python-list
mailing list