2013-07-20 3 views
2

Сегодня я имел странные ошибки при выполнении How to get all possible combinations of a list’s elements? решения Дэн H. Я получаю эту ошибку:Itertools не отозван

TypeError: 'itertools.combinations' object is not callable

Кто-нибудь знает, почему это и как это можно исправить? Я использую следующий код:

def all_subsets(ss): 
      return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1))) 

for subset in all_subsets([1,2,3,4]): 

После этого я получаю сообщение об ошибке. Может кто-нибудь мне помочь?

EDIT1:

Люди просили полный код, так вот некоторые Применимое часть ошибки кода:

from scapy.all import * 
import itertools 
from itertools import * 

def all_combinations(input): 
    return chain(*map(lambda y: combinations(input, y), range(0, len(input)+1))) 

extensionHeader=["IPv6ExtHdrHopByHop","IPv6ExtHdrRouting","IPv6ExtHdrDestOpt","IPv6ExtHdrFragment"] 
ip=IPv6(src="2a00:1450:4009:807::1002", dst="2a00:1450:4009:807::1002") 
combinations = itertools.combinations(extensionHeader, 1) 


for subset in all_combinations(extensionHeader): 
    index=0 
    finalForm="" 
    while index<len(subset): 
     substring=subset[index:index+17] 
     if substring is "IPv6ExtHdrRouting": 
      if index==0: 
       ip.nh=43 

Также здесь полная ошибка:

WARNING: No route found for IPv6 destination :: (no default route?) 
Traceback (most recent call last): 
    File "C:\Users\Martinooos\workspace\testing\scapyTest.py", line 18, in <module 
> 
    for subset in all_combinations(extensionHeader): 
    File "C:\Users\Martinooos\workspace\testing\scapyTest.py", line 11, in all_com 
binations 
    return chain(*map(lambda y: combinations(input, y), range(0, len(input)+1))) 
    File "C:\Users\Martinooos\workspace\testing\scapyTest.py", line 11, in <lambda 
> 
    return chain(*map(lambda y: combinations(input, y), range(0, len(input)+1))) 
TypeError: 'itertools.combinations' object is not callable 
+0

Как ваш код продолжается? Я мог бы воспроизвести ту же ошибку с этим кодом: 'комбинации (range (3), 2) (3) -> TypeError: объект itertools.combinations 'не вызываем'. Невозможно вызвать объект комбинации. Вы можете только перебирать его или применять к нему что-то вроде list(). – sjakobi

+0

Можете ли вы опубликовать полную трассировку стека? – user2357112

+0

Этот код работает для меня. Вы уверены, что случайно не использовали имя «комбинации» для чего-то еще и заменили «комбинации», импортированные из «цепочки»? – user2357112

ответ

1

EDIT:

Это ваша проблема:

combinations = itertools.combinations(extensionHeader, 1) 

Вы не хотите, чтобы сохранить результаты в комбинации, потому что тогда, когда вы пытаетесь использовать функцию combinations() в all_combinations(), Python будет пытаться использовать свои комбинации переменных как функции, так что вы получите ошибку:

'itertools.combinations' object is not callable

чтобы исправить, просто переименовать переменную что-нибудь другое, например:

combs = itertools.combinations(extensionHeader, 1) 

или изменить ваш all_combinations() использовать itertools.combinations, а не только combinations:

def all_combinations(input): 
    return itertools.chain(*map(lambda y: itertools.combinations(input, y), range(0, len(input)+1))) 
+0

Он должен был импортировать его уже. В противном случае он получит 'NameError' вместо успешной сборки объектов' itertools.combinations', а затем попытается назвать их как функции где-то. – user2357112

+0

После того, как OP разместил весь код, я обновил свой ответ соответственно. – jh314

+0

большое спасибо человек. Не могу поверить, что я не видел, что – Martin