2012-11-24 21 views
5

Mam następujący kod:Dlaczego otrzymuję 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 

I kiedy idę, aby go uruchomić pojawia się następujący błąd Traceback:

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

i nie może zrozumieć, dlaczego tak się dzieje.

Ktoś proszę rzucić pewne światło, z góry dzięki

+0

Wydaje mi się, że w opublikowanym przez Ciebie kodzie wystąpił błąd wcięcia. (import są wcięte, gdy nie powinny być) – mgilson

Odpowiedz

13

To nie wygląda na to, że importowany itertools ...

from itertools import product 

nie liczy jak tylko wyciągnąć product bezpośrednio do modułu namespace (twój moduł nadal nie wie nic o reszcie itertools wiedzieć Wystarczy dodać.

import itertools 

na szczycie Twój skrypt i ten błąd powinien zniknąć, ponieważ teraz masz ciągnięty obszar nazw itertools do przestrzeni nazw modułu pod nazwą itertools. Innymi słowy, aby uzyskać dostęp do funkcji chain, należy użyć itertools.chain (jak w powyższym skrypcie).

+0

kiedy to robię, to samo mówi, ale o "produkcie" –

+0

Możesz mieć oba u góry: 'import itertools' i' from itertools import product'. ale prawdopodobnie będziesz chciał użyć jednego lub drugiego. w tym przypadku należy zmienić "produkt" na "itertools.product", jeśli wykonujesz tylko 'import itertools'. – mgilson

1

Chcesz albo:

from itertools import chain, product 

i używać chain i product lub:

import itertools 

i używać itertools.chain i itertools.product.

0
import itertools 

from itertools import izip_longest 

To pomogło mi korzystać itertools a następnie móc korzystać izip_longest dla iteracja nierównej długości tablic.

Powiązane problemy