2016-05-30 19 views
0

Ich versuche gerade, eine Abstraktion für einige Spark-Streaming-Jobs zu schreiben, die jeweils einen Teil des Codes haben, der zwischen allen gleich ist (daher die Notwendigkeit einer Abstraktion).Existiert eine Liste, in der jeder Artikel Mitglied ist?

Das Format jeder Job ist in diesem Format:

dStream \ 
     .filter(lambda rec: rec[self.EVENT_KEY_VALUE[0]] in list(self.EVENT_KEY_VALUE[1])) \ 
     .filter(lambda rec: self.EVENT_FIELDS.issubset(set(rec.keys()))) \ 

for INPUT in INPUTS: 
     dStream \ 
      .map(lambda rdd: format_record_keys_for_salesforce(self.INPUT)) 

for map_func in OPTIONAL_MAPS: 
     dStream \ 
      .map(map_func) 

return dStream.map(self.OUTPUT.project_row) 

Es gibt immer eine format_record_keys_for_salesforce Karte Bühne ist und immer eine dStream.map(self.OUTPUT.project_row) Bühne. Das Problem kommt von den ersten beiden filter() s. Es gibt fast immer die zwei Filterstufen in jedem Job, aber manchmal erfordert es der Job nicht. Ich würde lieber die Filter redundant sein lassen und nichts als True zurückgeben, als ein Entwickler extra Code schreiben muss.

Also, wie kann ich eine list schreiben, wo ein beliebiger Wert ein Mitglied davon ist? Wir kennen die Werte nicht vorher, nur dass es ein Mitglied der Liste ist.

Art wie:

>> 'a' in list(all) 
True 
>> 5 in list(all) 
True 
>> *anything* in list(all) 
True 
>> ALL_NATURAL_NUMBERS in list(all) 
True 
>> ALL_SUBSETS_OF_NATURAL_NUMBERS in list(all) 
True 
etc... 

Ist das möglich oder muss ich auf diese Stufen aus meiner Abstraktion entfernen und überlassen es dem Entwickler schriftlich Job zu entscheiden, ob sie einen Filter brauchen oder nicht?

+0

ich nicht ganz verstehe Ihre Frage zu tun, Listen in Python können habe irgendwelche Objekte in ihnen: 'a = ['a', 5, int, (lambda: 1 + 2), Karte]; 5 in a -> Wahr; 'a' in a -> True' –

+0

Die Sache ist, wir wissen nicht, was in der Liste sein könnte, die Sache, die du auf Mitgliedschaft prüfst, könnte absolut alles sein, und ich möchte, dass es in der Liste ist . Hilft das? –

+1

ah, na ja, nicht, wenn Sie es in eine Liste umwandeln, aber ein Objekt, das '__contains__ 'überlädt, kann simulieren, dass es jeden möglichen Wert enthält. –

Antwort

1

Wenn ich Sie richtig verstehe, brauchen Sie ein listenähnliches Objekt, das behauptet, dass es irgendein Objekt enthält.

Sie müssen eine list-like class definieren.

Die einfachste Lösung, die ich denken kann, ist ein schmutziger Hack:

class MyList(list): 
    def __contains__(self, item): 
     return True 

dann für jeden zu anyValue zugewiesenen Wert:

>>> anyValue in MyList([]) 
True 
2

Wenn ich richtig verstehe, wollen Sie nur den Operator spotten. Also vielleicht so etwas wie: