[Tutor] Python 2.7.1 interpreter complains about NameError: global name 'levenshtein_automata' is not defined

2010-12-27 Thread Frank Chang
  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

2010-12-28 Thread Frank Chang
   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

2010-12-29 Thread Frank Chang
 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

2010-12-29 Thread Frank Chang
   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

2010-12-30 Thread Frank Chang
   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