2012-11-24 41 views
5

Tôi có đoạn mã sau:Tại sao tôi nhận được một NameError?

from crypt import crypt 
from itertools import product 
from string import ascii_letters, digits 

def decrypt(all_hashes, salt, charset=ascii_letters + digits + "-"): 
    products = (product(charset, repeat=r) for r in range(8)) 
    chain = itertools.chain.from_iterable(products) 
    for candidate in chain: 
     hash = crypt(candidate, salt) 
     if hash in all_hashes: 
       yield candidate, hash 
       all_hashes.remove(hash) 
       if not all_hashes: 
       return 

all_hashes = ['aaRrt6qwqR7xk', 'aaacT.VSMxhms' , 'aaWIa93yJI9kU', 
'aakf8kFpfzD5E', 'aaMOPiDnXYTPE', 'aaz71s8a0SSbU', 'aa6SXFxZJrI7E' 
'aa9hi/efJu5P.', 'aaBWpr07X4LDE', 'aaqwyFUsGMNrQ', 'aa.lUgfbPGANY' 
'aaHgyDUxJGPl6', 'aaTuBoxlxtjeg', 'aaluQSsvEIrDs', 'aajuaeRAx9C9g' 
'aat0FraNnWA4g', 'aaya6nAGIGcYo', 'aaya6nAGIGcYo', 'aawmOHEectP/g' 
'aazpGZ/jXGDhw', 'aadc1hd1Uxlz.', 'aabx55R4tiWwQ', 'aaOhLry1KgN3.' 
'aaGO0MNkEn0JA', 'aaGxcBxfr5rgM', 'aa2voaxqfsKQA', 'aahdDVXRTugPc' 
'aaaLf47tEydKM', 'aawZuilJMRO.w', 'aayxG5tSZJJHc', 'aaPXxZDcwBKgo' 
'aaZroUk7y0Nao', 'aaZo046pM1vmY', 'aa5Be/kKhzh.o', 'aa0lJMaclo592' 
'aaY5SpAiLEJj6', 'aa..CW12pQtCE', 'aamVYXdd9MlOI', 'aajCM.48K40M.' 
'aa1iXl.B1Zjb2', 'aapG.//419wZU'] 


all_hashes = set(all_hashes) 
salt = 'aa' 
for candidate, hash in decrypt(all_hashes, salt): 
    print 'Found', hash, '! The original string was', candidate 

Và khi tôi đi để chạy nó tôi nhận được lỗi traceback sau:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in decrypt 
NameError: global name 'itertools' is not defined 

Và không thể tìm ra lý do tại sao nó đang xảy ra.

Có người xin làm sáng tỏ, cảm ơn trước

+0

Tôi nghĩ bạn có lỗi thụt lề trong mã bạn đã đăng. (nhập khẩu được thụt lề khi chúng không được) – mgilson

Trả lời

13

Nó không giống như bạn nhập itertools ...

from itertools import product 

không tính làm như thế sẽ chỉ kéo product trực tiếp vào của mô-đun của bạn không gian tên (mô-đun của bạn vẫn không biết gì về phần còn lại của itertools. Chỉ cần thêm:

import itertools 

ở đầu kịch bản của bạn và lỗi đó sẽ biến mất vì bây giờ bạn đã kéo không gian tên itertools vào không gian tên của mô-đun của bạn dưới tên itertools. Nói cách khác, để có quyền truy cập vào chức năng chain, bạn sẽ sử dụng itertools.chain (như bạn có trong tập lệnh ở trên).

+0

khi tôi làm như vậy nó nói giống nhau nhưng về "sản phẩm" –

+0

Bạn có thể có cả hai ở trên cùng: 'import itertools' và' từ itertools import product'. nhưng, bạn có thể muốn sử dụng 1 hoặc cái kia. trong trường hợp này, bạn sẽ thay đổi 'product' thành' itertools.product' nếu bạn chỉ làm 'import itertools'. – mgilson

1

Bạn muốn một trong hai:

from itertools import chain, product 

và sử dụng chainproduct, hoặc:

import itertools 

và sử dụng itertools.chainitertools.product.

0
import itertools 

from itertools import izip_longest 

này đã giúp tôi sử dụng itertools và sau đó có thể sử dụng izip_longest cho iterating qua chiều dài không bằng phẳng của mảng.

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