2012-10-04 20 views
10

Tôi mới dùng python và đang làm việc trên bản đồ làm giảm vấn đề với mincemeat. Tôi nhận được lỗi sau trong khi chạy tập lệnh mincemeat.tên toàn cầu 're' không được xác định

$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]) 

Mã của tôi nằm trong tập lệnh raw1.py được cung cấp trong ngăn xếp ở trên là [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): 
      # .... 

Tôi đã nhập re trong raw1.py. Lỗi này không xuất hiện nếu tôi nhập re trong mincemeat.py.

+3

hurray, vui mừng khi thấy một sinh viên khác từ khóa học dữ liệu lớn tại coursera. – RAbraham

Trả lời

3

Biến "Toàn cầu" trong python thực sự được đưa vào mô-đun/tệp mà chúng bị ràng buộc; bạn cần phải nhập chúng vào mọi tệp sử dụng chúng.

Tên mô-đun chỉ là một biến như bất kỳ thứ gì khác.

+1

Bạn có thể thấy rằng Satyajit _does_ nhập 're' vào cùng một tệp mà nó được sử dụng. Tuy nhiên, theo cách thức hoạt động của mincemeat, mapfn kết thúc thực hiện trong một ngữ cảnh mà nó không có quyền truy cập vào các mục nhập ban đầu. –

+0

@MichaelFairley: mincemeat.py là một tệp riêng biệt không có nhập. – geoffspear

+1

mincemeat.py là một thư viện đang được sử dụng mà không phụ thuộc vào 're'. Tuy nhiên, mặc dù 'mapfn' được định nghĩa trong raw1.py, nó kết thúc bằng việc thực thi bên trong một quy trình python khác trong ngữ cảnh của mincemeat.py. Thay vì sửa đổi chính thư viện, 'import' có thể (và nên) được thêm vào' mapfn'. –

0

Có vẻ như bạn đã trả lời câu hỏi này. Nếu bạn sử dụng lại trong mincemeat.py, bạn sẽ cần nhập lại ở đó.

12

Bạn cần có tuyên bố nhập trong chính số mapfn. mapfn được thực hiện trong một quá trình python khác, do đó, nó không có quyền truy cập vào ngữ cảnh gốc (bao gồm cả nhập khẩu), trong đó nó được khai báo.

+0

Cảm ơn bạn đã dành cho mincemeat! Nó là một dụng cụ hữu ích. Tôi đã tự hỏi vì câu hỏi này có thể là một sự xuất hiện phổ biến, bạn có thể đề cập đến điều này trong wiki github của bạn cho mincemeat? – RAbraham

+0

Ý tưởng hay. Làm xong! –

Các vấn đề liên quan