FAQ
Hi experts,

I've built a class for parsing a user-defined list of files and matching
lines with a user-defined list of regular expressions. It looks like this:

<code>
import re
import glob

class LineMatcher:
""" Parses a list of text files, matching their lines with the given
regular expressions and executing associated actions."""

def __init__(self):
# List of file names to parse for matching.
self.file_names = []
# Association of reg expressions to actions to execute when match.
self.regexp_action = {}

def go(self):
for file_name in self.file_names:
file = open(file_name)
for line in file:
for regexp, action in self.regexp_action.items():
match = regexp.match(line)
if match:
action(line, match.groupdict())

def add_files(self, file_pattern):
self.file_names.extend(glob.glob(file_pattern))

def add_action(self, regexp_string, action):
self.regexp_action[re.compile(regexp_string)] = action
</code>

But then, when I try to use my class using actions with "memory" it will
fail:

<code>
import LineMatcher

global count
count = 0

def line_action(line, match_dictionary):
count = count + 1

line_matcher = LineMatcher.LineMatcher()
line_matcher.add_files('*')
line_matcher.add_action(r'(?P<line>.*)', line_action)
line_matcher.go()
</code>

The error is:
<console>
Traceback (most recent call last):
File "Test.py", line 12, in ?
line_matcher.go()
File "LineMatcher.py", line 21, in go
action(line, match.groupdict())
File "Test.py", line 7, in line_action
count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment
</console>

How would you do this?

Regards,
Tito

Search Discussions

  • Fredrik Lundh at Apr 9, 2006 at 10:47 am

    Ernesto Garc?a Garc?a wrote:

    But then, when I try to use my class using actions with "memory" it will
    fail:

    <code>
    import LineMatcher

    global count
    count = 0

    def line_action(line, match_dictionary):
    count = count + 1

    line_matcher = LineMatcher.LineMatcher()
    line_matcher.add_files('*')
    line_matcher.add_action(r'(?P<line>.*)', line_action)
    line_matcher.go()
    </code>

    The error is:
    <console>
    Traceback (most recent call last):
    File "Test.py", line 12, in ?
    line_matcher.go()
    File "LineMatcher.py", line 21, in go
    action(line, match.groupdict())
    File "Test.py", line 7, in line_action
    count = count + 1
    UnboundLocalError: local variable 'count' referenced before assignment
    </console>

    How would you do this?
    def line_action(line, match_dictionary):
    global count # make it a module-global variable, not a function-local
    count = count + 1

    </F>
  • Ernesto García García at Apr 9, 2006 at 7:48 pm

    How would you do this?
    def line_action(line, match_dictionary):
    global count # make it a module-global variable, not a function-local
    count = count + 1

    </F>
    OK, I had put it on the global block.

    Thanks,
    Ernesto
  • Bruno at Apr 10, 2006 at 9:58 am

    Ernesto Garc?a Garc?a wrote:
    Hi experts,

    I've built a class for parsing a user-defined list of files and matching
    lines with a user-defined list of regular expressions. It looks like this:
    (snip code)
    But then, when I try to use my class using actions with "memory" it will
    fail:

    <code>
    import LineMatcher

    global count
    count = 0

    def line_action(line, match_dictionary):
    count = count + 1 (snip)
    </code>

    The error is:
    <console> (snip)
    UnboundLocalError: local variable 'count' referenced before assignment
    </console>

    How would you do this?
    FWIW, I would *not* use a global.

    class LineAction(object):
    def __init__(self):
    self.count = 0

    def __call__(self, line, match_dictionary):
    self.count +=1

    line_action = LineAction()

    line_matcher = LineMatcher.LineMatcher()
    line_matcher.add_files('*')
    line_matcher.add_action(r'(?P<line>.*)', line_action)
    line_matcher.go()

    HTH
    --
    bruno desthuilliers
    python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
    p in 'onurb at xiludom.gro'.split('@')])"

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedApr 9, '06 at 10:24a
activeApr 10, '06 at 9:58a
posts4
users3
websitepython.org

People

Translate

site design / logo © 2022 Grokbase