2012-10-04 15 views
10

Soy nuevo en Python y trabajar en un mapa reduce el problema con carne picada. Recibo el siguiente error al ejecutar el script mincemeat.El nombre global 're' no está definido

$python mincemeat.py -p changeme localhost 
error: uncaptured python exception, closing channel <__main__.Client connected at 0x923fdcc> 
(<type 'exceptions.NameError'>:global name 're' is not defined 
[/usr/lib/python2.7/asyncore.py|read|79] 
[/usr/lib/python2.7/asyncore.py|handle_read_event|438] 
[/usr/lib/python2.7/asynchat.py|handle_read|140] 
[mincemeat.py|found_terminator|96] 
[mincemeat.py|process_command|194] 
[mincemeat.py|call_mapfn|170] 
[raw1.py|mapfn|43]) 

Mi código se basa en escritura raw1.py que se da en el StackTrace anteriormente como [raw1.py|mapfn|43].

import re 
import mincemeat 

# ... 

allStopWords = {'about':1, 'above':1, 'after':1, 'again':1} 

def mapfn(fname, fcont): 
    # ... 
    for item in tList[1].split(): 
     word = re.sub(r'[^\w]', ' ', item).lower().strip()  # ERROR 
     if (word not in allStopWords) and (len(word) > 1): 
      # .... 

Ya he importado re en raw1.py. El error no aparece si importo re en mincemeat.py.

+3

hurrah, feliz de ver a un compañero del curso de big data en coursera. – RAbraham

Respuesta

3

Las variables "globales" en python en realidad se limitan al módulo/archivo al que están vinculadas; necesita importarlos en cada archivo que los use.

Un nombre de módulo es simplemente una variable como cualquier otra cosa.

+1

Puede ver que Satyajit _does_ import 're' en el mismo archivo donde se usa. Sin embargo, a la manera en que funciona el mincemeat, mapfn termina ejecutándose en un contexto donde no tiene acceso a las importaciones originales. –

+0

@MichaelFairley: mincemeat.py es un archivo separado sin importar. – geoffspear

+1

mincemeat.py es una biblioteca que se usa sin dependencia de 're'. Sin embargo, aunque 'mapfn' está definido en raw1.py, termina ejecutándose dentro de un proceso python diferente en el contexto de mincemeat.py. En lugar de modificar la biblioteca en sí, la 'importación' puede (y debe) agregarse a' mapfn'. –

0

Parece que ya ha respondido esta pregunta. Si usa re en mincemeat.py, también deberá importar re allí.

12

Necesita tener la declaración de importación en mapfn sí mismo. mapfn se ejecuta en un proceso de python diferente, por lo que no tiene acceso al contexto original (incluidas las importaciones) en el que se declaró.

+0

¡Gracias por carne picada! Es una gran herramienta. Me preguntaba, ya que esta pregunta puede ser una ocurrencia común, ¿podría mencionar esto en su wiki de github para carne picada? – RAbraham

+0

Buena idea. ¡Hecho! –

Cuestiones relacionadas