[Tutor] Python 2.7.1 interpreter complains about NameError: global name 'levenshtein_automata' is not defined
Good morning, I am using Python 2.7.1 on Windows XP Service Pack 3. Here is the program where the Python interpreter complains about NameError: global name 'levenshtein_automata' is not defined. The python 2,7.1 error message is: Traceback (most recent call last): File "automata_test.py", line 174, in length = len(list(testdfa.find_all_matches('food', 1, m))) File "automata_test.py", line 145, in find_all_matches lev = levenshtein_automata(word, k).to_dfa() NameError: global name 'levenshtein_automata' is not defined Here is the program. I have marked lines 174, 145 and 125. import bisect import random class NFA(object): EPSILON = object() ANY = object() def __init__(self, start_state): self.transitions = {} self.final_states = set() self._start_state = start_state @property def start_state(self): return frozenset(self._expand(set([self._start_state]))) def add_transition(self, src, input, dest): self.transitions.setdefault(src, {}).setdefault(input, set()).add(dest) def add_final_state(self, state): self.final_states.add(state) def is_final(self, states): return self.final_states.intersection(states) def _expand(self, states): frontier = set(states) while frontier: state = frontier.pop() new_states = self.transitions.get(state, {}).get(NFA.EPSILON, set()).difference(states) frontier.update(new_states) states.update(new_states) return states def next_state(self, states, input): dest_states = set() for state in states: state_transitions = self.transitions.get(state, {}) dest_states.update(state_transitions.get(input, [])) dest_states.update(state_transitions.get(NFA.ANY, [])) return frozenset(self._expand(dest_states)) def get_inputs(self, states): inputs = set() for state in states: inputs.update(self.transitions.get(state, {}).keys()) return inputs def to_dfa(self): dfa = DFA(self.start_state) frontier = [self.start_state] seen = set() while frontier: current = frontier.pop() inputs = self.get_inputs(current) for input in inputs: if input == NFA.EPSILON: continue new_state = self.next_state(current, input) if new_state not in seen: frontier.append(new_state) seen.add(new_state) if self.is_final(new_state): dfa.add_final_state(new_state) if input == NFA.ANY: dfa.set_default_transition(current, new_state) else: dfa.add_transition(current, input, new_state) return dfa class DFA(object): def __init__(self, start_state): self.start_state = start_state self.transitions = {} self.defaults = {} self.final_states = set() def add_transition(self, src, input, dest): self.transitions.setdefault(src, {})[input] = dest def set_default_transition(self, src, dest): self.defaults[src] = dest def add_final_state(self, state): self.final_states.add(state) def is_final(self, state): return state in self.final_states def next_state(self, src, input): state_transitions = self.transitions.get(src, {}) return state_transitions.get(input, self.defaults.get(src, None)) def next_valid_string(self, input): state = self.start_state stack = [] # Evaluate the DFA as far as possible print state for i, x in enumerate(input): print "%s" % input print 'e' stack.append((input[:i], state, x)) state = self.next_state(state, x) if not state: break else: stack.append((input[:i+1], state, None)) if self.is_final(state): # Input word is already valid return input # Perform a 'wall following' search for the lexicographically smallest # accepting state. while stack: path, state, x = stack.pop() x = self.find_next_edge(state, x) #print 'x' if x: path += x state = self.next_state(state, x) if self.is_final(state): print 'p' return path stack.append((path, state, None)) print 'v' return None def find_next_edge(self, s, x): if x is None: x = '\0' # u'\0' else: x = chr(ord(x) + 1) state_transitions = self.transitions.get(s, {}) if x in state_transitions or s in self.defaults: return x labels = sorted(state_transitions.keys()) pos = bisect.bisect_left(labels, x) if pos < len(labels): print 'n' return labels[pos] return None def levenshtein_automata(self, term, k):# line 125 ' nfa = NFA((0, 0)) for i, c in enumerate(term): for e in range(k + 1): # Correct character nfa.add_transition((i, e), c, (i + 1, e)) if e < k: # Deletion nfa.add_transition((i, e), NFA.ANY, (i, e + 1)) # Insertion nfa.add_transition((i, e), NFA.EPSILON, (i + 1, e + 1)) # Substitution nfa.add_transition((i, e), NFA.ANY, (i + 1, e + 1))
[Tutor] Python 2.7.1 interpreter passing function pointer as function argument and Shedskin 0.7
Good afternoon. I want to thank everyone who helped me fix the global name 'levinshtein_automata' is not defined error. When I run the Shedskin 0.7 Python to C+++ compiler on the same python program, I receive the error message * Error * automata_test.py:148 : unbound identifier 'lookup_func'. lookup_func is a python function pointer passed as an argument to a python function. I have marked lines 148,161,172 and 174 in the python program automata_test.py shown below. The shedskin tutorial says the latest version of the Shedskin 0.7 Python to C++ compiler does not support overloading __iter__ and __call__. I was wondering if anyone could suggest a python workaround to this error message as I am new to python. Thank you. # automata_test.py import bisect import random class NFA(object): EPSILON = object() ANY = object() def __init__(self, start_state): self.transitions = {} self.final_states = set() self._start_state = start_state @property def start_state(self): return frozenset(self._expand(set([self._start_state]))) def add_transition(self, src, input, dest): self.transitions.setdefault(src, {}).setdefault(input, set()).add(dest) def add_final_state(self, state): self.final_states.add(state) def is_final(self, states): return self.final_states.intersection(states) def _expand(self, states): frontier = set(states) while frontier: state = frontier.pop() new_states = self.transitions.get(state, {}).get(NFA.EPSILON, set()).difference(states) frontier.update(new_states) states.update(new_states) return states def next_state(self, states, input): dest_states = set() for state in states: state_transitions = self.transitions.get(state, {}) dest_states.update(state_transitions.get(input, [])) dest_states.update(state_transitions.get(NFA.ANY, [])) return frozenset(self._expand(dest_states)) def get_inputs(self, states): inputs = set() for state in states: inputs.update(self.transitions.get(state, {}).keys()) return inputs def to_dfa(self): dfa = DFA(self.start_state) frontier = [self.start_state] seen = set() while frontier: current = frontier.pop() inputs = self.get_inputs(current) for input in inputs: if input == NFA.EPSILON: continue new_state = self.next_state(current, input) if new_state not in seen: frontier.append(new_state) seen.add(new_state) if self.is_final(new_state): dfa.add_final_state(new_state) if input == NFA.ANY: dfa.set_default_transition(current, new_state) else: dfa.add_transition(current, input, new_state) return dfa class DFA(object): def __init__(self, start_state): self.start_state = start_state self.transitions = {} self.defaults = {} self.final_states = set() def add_transition(self, src, input, dest): self.transitions.setdefault(src, {})[input] = dest def set_default_transition(self, src, dest): self.defaults[src] = dest def add_final_state(self, state): self.final_states.add(state) def is_final(self, state): return state in self.final_states def next_state(self, src, input): state_transitions = self.transitions.get(src, {}) return state_transitions.get(input, self.defaults.get(src, None)) def next_valid_string(self, input): state = self.start_state stack = [] # Evaluate the DFA as far as possible print state for i, x in enumerate(input): print "%s" % input print 'e' stack.append((input[:i], state, x)) state = self.next_state(state, x) if not state: break else: stack.append((input[:i+1], state, None)) if self.is_final(state): # Input word is already valid return input # Perform a 'wall following' search for the lexicographically smallest # accepting state. while stack: path, state, x = stack.pop() x = self.find_next_edge(state, x) #print 'x' if x: path += x state = self.next_state(state, x) if self.is_final(state): print 'p' return path stack.append((path, state, None)) print 'v' return None def find_next_edge(self, s, x): if x is None: x = '\0' else: x = chr(ord(x) + 1) state_transitions = self.transitions.get(s, {}) if x in state_transitions or s in self.defaults: return x labels = sorted(state_transitions.keys()) pos = bisect.bisect_left(labels, x) if pos < len(labels): print 'n' return labels[pos] return None def levenshtein_automata(self, term, k): print 's' nfa = NFA((0, 0)) for i, c in enumerate(term): for e in range(k + 1): # Correct ch
Re: [Tutor] Python 2.7.1 interpreter passing function pointer as function argument and Shedskin 0.7
I asked the Shedskin developers about this issue and they are currently adding support for __call__ . They recommend renaming the class Matcher __call__ method ,for example as next, and then explicitly call it on line 148 as lookup_func.next(match). I followed their suggestion and the Shedskin 0.7 Python to C++ compiler does not complain about the unbound identifier 'lookup_func' anymore. I apologize for the cut and paste mangling. Is there a better method than copy-pasting for including 20 or more lines of python source code in the tutor posts? Thank you. def find_all_matches(self, word, k, lookup_func): lev = self.levenshtein_automata(word, k).to_dfa() match = lev.next_valid_string('\0') while match: follow = lookup_func.test(match) ### line 148 ### if not follow: return if match == follow: yield match follow = follow + '\0' match = lev.next_valid_string(follow) class Matcher(object): def __init__(self, l): self.l = l self.probes = 0 def test(self, w): self.probes += 1 pos = bisect.bisect_left(self.l, w) if pos < len(self.l): return self.l[pos] else: return None ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
[Tutor] Python 2.7.1 interpreter question
I separated my test program into two python files. The first one is automata.py. The pastebin url for automata.py is: http://pastebin.com/embed_iframe.php?i=J9MRPibX"; style="border:none;width:100%"> The second file is automata_test2.py. It imports automata.py. The pastebin url for automata_test2.py is: http://pastebin.com/embed_iframe.php?i=A44d2EvV"; style="border:none;width:100%">. When I use the Python 2.7.1 interpreter I get the following traceback : F:\shedskin\shedskin-0.7>python automata_test2.py Traceback (most recent call last): File "automata_test2.py", line 23, in list(automata.find_all_matches('nice', 1, m)) AttributeError: 'module' object has no attribute 'find_all_matches' Could anyone help me fix this error? I am new to python. Thank you. ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Python 2.7.1 interpreter
I wanted to thank Steven D'Aprano and Allan Gauld for solving my Python 2.7.1 interpreter question in Tutor Digest Vol. 82 Issue 121. Thank you for yor help. ___ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor