Storing objects required by functions.

Matt Goodall matt at pollenation.net
Tue Dec 30 10:38:15 EST 2003


David M. Wilson wrote:

>Further to my last post here, I was playing some more with building a
>regex object and storing it somewhere for use internally by a
>function. I'm not happy with any of my solutions:
>
>
># I don't like this, but the fact that you can modify the procedure's
># function via a named argument seems neat in a hacky sort of way.
>
>def uses_default_parm_yuck(x, r = re.compile("...")):
>    pass
>
>
>g = re.compile('...')
>
>def uses_global_yuck(x):
>    global g
>    pass
>  
>
There is no need to define g as global unless you actually need to 
rebind g inside the function.

>
># This is horrible and probably slow.
>
>class is_hex:
>    def __init__(self):
>        self.r = re.compile('...')
>
>    def __call__(self, x):
>        r = self.r
>        pass
>
>is_hex = is_hex()
>  
>
I doubt it's that much slower (if at all). You should profile it to check.

>
># This mucks up scoping so that your procedure can't access it's
># parent scope like it could normally. Since I never do this,
># it's my favourite.
>
>def is_hex():
>    r = re.compile('...')
>    def is_hex(s):
>        return r.match(s) is not None
>    return is_hex
>
>is_hex = is_hex()
>
>
>
>Am I missing something? Is there a nicer way of doing this? On a day
>to day basis I find myself in this situation quite regularly, and now
>I come to think of it today, it is something that I would like to
>improve.
>
>It is funny that in private it has never bothered me much, but when
>posting on comp.lang.python I find that the code is unacceptable.
>Maybe I have two modes of programming, idealist and practical? *shrug*
>:)
>
>
>David.
>  
>

Another alternative relies on the fact that functions themselves are 
objects so you could do this:

    def is_hex(s):
        return is_hex.r.match(s) is not None

    is_hex.r = re.compile(...)


Although, for simplicity, I would probably just make the compiled regex 
a module scope variable with a sensible name, maybe even using the _ 
prefix to hint that noone should touch it:

    _is_hex_regex = re.compile(...)

    def is_hex(s):
        return _is_hex_regex.match(s) is not None


Cheers, Matt

-- 
Matt Goodall, Pollenation Internet Ltd
w: http://www.pollenationinternet.com
e: matt at pollenation.net







More information about the Python-list mailing list