Mailing List Archive

Passing info to function used in re.sub
I'm looking for some advice for how to write this in a clean way

I want to replace some text using a regex-pattern, but before creating replacement text I need to some file checking/copying etc. My code right now look something like this:

def fix_stuff(m):
# Do various things that involves for info
# that what's available in m
replacement_text = m.group(1) + global_var1 + global_var2
return replacement_text

and the call comes here

global_var1 = "bla bla"
global_var2 = "pff"

new_text = re.sub(im_pattern,fix_stuff,md_text)


The "problem" is that I've currently written some code that works but it uses global variables ... and I don't like global variables. I assume there is a better way to write this, but how?

= jem
--
https://mail.python.org/mailman/listinfo/python-list
Re: Passing info to function used in re.sub [ In reply to ]
On 2023-09-03 17:10, Jan Erik Moström via Python-list wrote:
> I'm looking for some advice for how to write this in a clean way
>
> I want to replace some text using a regex-pattern, but before creating replacement text I need to some file checking/copying etc. My code right now look something like this:
>
> def fix_stuff(m):
> # Do various things that involves for info
> # that what's available in m
> replacement_text = m.group(1) + global_var1 + global_var2
> return replacement_text
>
> and the call comes here
>
> global_var1 = "bla bla"
> global_var2 = "pff"
>
> new_text = re.sub(im_pattern,fix_stuff,md_text)
>
>
> The "problem" is that I've currently written some code that works but it uses global variables ... and I don't like global variables. I assume there is a better way to write this, but how?
>
You could use pass an anonymous function (a lambda) to re.sub:

def fix_stuff(m, var1, var2):
# Do various things that involves for info
# that what's available in m
replacement_text = m.group(1) + var1 + var2
return replacement_text

global_var1 = "bla bla"
global_var2 = "pff"

new_text = re.sub(im_pattern, lambda m, var1=global_var1,
var2=global_var2: fix_stuff(m, var1, var2), md_text)

Or, if you prefer a named function, define one just before the re.sub:

def fix_stuff(m, var1, var2):
# Do various things that involves for info
# that what's available in m
replacement_text = m.group(1) + var1 + var2
return replacement_text

global_var1 = "bla bla"
global_var2 = "pff"

def fix_it(m, var1=global_var1, var2=global_var2):
return fix_stuff(m, var1, var2)

new_text = re.sub(im_pattern, fix_it, md_text)

--
https://mail.python.org/mailman/listinfo/python-list
Re: Passing info to function used in re.sub [ In reply to ]
On 3 Sep 2023, at 19:13, MRAB via Python-list wrote:

> You could use pass an anonymous function (a lambda) to re.sub:

Of course !! Thanks.

= jem
--
https://mail.python.org/mailman/listinfo/python-list
Re: Passing info to function used in re.sub [ In reply to ]
On 9/3/2023 12:10 PM, Jan Erik Moström via Python-list wrote:
> I'm looking for some advice for how to write this in a clean way
>
> I want to replace some text using a regex-pattern, but before creating replacement text I need to some file checking/copying etc. My code right now look something like this:
>
> def fix_stuff(m):
> # Do various things that involves for info
> # that what's available in m
> replacement_text = m.group(1) + global_var1 + global_var2
> return replacement_text
>
> and the call comes here
>
> global_var1 = "bla bla"
> global_var2 = "pff"
>
> new_text = re.sub(im_pattern,fix_stuff,md_text)
>
>
> The "problem" is that I've currently written some code that works but it uses global variables ... and I don't like global variables. I assume there is a better way to write this, but how?
>
> = jem

There are two things to keep in mind here, I think. First, in Python a
"global" variable is really module-level, so variables specific to one
module seem fine and are common practice.

Second, the way you have written this example, it looks like these
module-level "variables" are in effect constants. In other words, they
are just shorthand for specific declared quantities. If this is so,
then it makes even more sense to define them as module-level objects in
the module that needs to use them.

If you still don't want to use them as "global" in your module, then
define them in a separate module and import them from that module.

--
https://mail.python.org/mailman/listinfo/python-list
Re: Passing info to function used in re.sub [ In reply to ]
On 2023-09-03 18:10:29 +0200, Jan Erik Mostr?m via Python-list wrote:
> I want to replace some text using a regex-pattern, but before creating
> replacement text I need to some file checking/copying etc. My code
> right now look something like this:
>
> def fix_stuff(m):
> # Do various things that involves for info
> # that what's available in m
> replacement_text = m.group(1) + global_var1 + global_var2
> return replacement_text
>
> and the call comes here
>
> global_var1 = "bla bla"
> global_var2 = "pff"
>
> new_text = re.sub(im_pattern,fix_stuff,md_text)
>
>
> The "problem" is that I've currently written some code that works but
> it uses global variables ... and I don't like global variables. I
> assume there is a better way to write this, but how?

If you use fix_stuff only inside one other function, you could make it
local to that function so that it will capture the local variables of
the outer function:

import re

def demo():

local_var1 = "bla bla"
local_var2 = "pff"

def fix_stuff(m):
# Do various things that involves for info
# that what's available in m
replacement_text = m.group(1) + local_var1 + local_var2
return replacement_text

for md_text in ( "aardvark", "barbapapa", "ba ba ba ba barbara ann"):
new_text = re.sub(r"(a+).*?(b+)", fix_stuff, md_text)
print(md_text, new_text)

demo()

hp

--
_ | Peter J. Holzer | Story must make more sense than reality.
|_|_) | |
| | | hjp@hjp.at | -- Charles Stross, "Creative writing
__/ | http://www.hjp.at/ | challenge!"
Re: Passing info to function used in re.sub [ In reply to ]
Jan Erik Mostr?m wrote at 2023-9-3 18:10 +0200:
>I'm looking for some advice for how to write this in a clean way
> ...
>The "problem" is that I've currently written some code that works but it uses global variables ... and I don't like global variables. I assume there is a better way to write this, but how?

You could define a class with a `__call__` method
and use an instance of the class as replacement.
The class and/or instance can provide all relevant information via
attributes.

--
https://mail.python.org/mailman/listinfo/python-list
Re: Passing info to function used in re.sub [ In reply to ]
On 3 Sep 2023, at 18:10, Jan Erik Moström via Python-list wrote:

> I'm looking for some advice for how to write this in a clean way

Thanks for all the suggestion, I realize that I haven't written Python code in a while. I should have remembered this myself !!! Thanks for reminding me.

= jem
--
https://mail.python.org/mailman/listinfo/python-list