2017-04-05 6 views
1

Ich habe eine Methode, die Kwargs und Zukunft abruft. Ich würde gerne ein Wörterbuch von Kwarts in Zukunft speichern für die spätere Verarbeitung von Ergebnissen mit Kwargs.Verwenden Sie Kwargs als Schlüssel im Wörterbuch

class ThreadPoolExecutorImproved(object): 

def __init__(self, max_workers): 
    self._executor = ThreadPoolExecutor(max_workers) 
    self._futures = {} 

def __enter__(self): 
    return self 

def __exit__(self, exc_type, exc_val, exc_tb): 
    kwargs_to_exception = {} 
    for kwargs, future in self._futures.iteritems(): 
     if future.exception(): 
      kwargs_to_exception[kwargs] = future.exception 

    if kwargs_to_exception: 
     raise ThreadPoolException(kwargs_to_exception) 

def submit(self, fn, *args, **kwargs): 
    future = self._executor.submit(fn, *args, **kwargs) 
    key = tuple(kwargs.items()) 
    self._futures[key] = future 
    return future 

Allerdings bekomme ich einen Fehler auf der Linie self.futures[key] = future:

TypeError: unhashable type: 'dict' for python 

warum ist es? Ich habe ein Tupel von Kwargs erstellt!

+2

Es heißt, Sie haben ein ** Wörterbuch ** in einem der ** Werte ** von 'Kwargs'. –

+0

Ich habe es. also würde ich jeden Wert benötigen, um es mit einem Tupel zu umhüllen? – Dejell

+0

können Sie tatsächlich jedes Wörterbuch in ein Tupeläquivalent umwandeln. Beachten Sie, dass Sie dies ** rekursiv durchführen müssen **, da diese Wörterbücher auch Wörterbücher usw. enthalten können. –

Antwort

1

Die typische Problemumgehung für diese Situation ist die Verwendung von future als Schlüssel; Ihr Code

key = tuple(kwargs.items()) 
self._futures[key] = future 

Migrate zu

self._futures[future] = tuple(kwargs.items()) 

Und wenn Sie self._futures bearbeiten möchten, können Sie einfach durchlaufen diese

for future, kw in self._futures: 
    # check kw 
    # do your stuff 
Verwandte Themen