2016-06-01 12 views
0

Ich suche nicht die tatsächliche Signatur der Methodeändern Python-Methode Parameternamen programmatisch

Ich will nicht zu ändern, um eine neue Methode mit neuen Parameternamen erstellen

Wie kann ich ändern der Name eines Parameters in der Signatur einer Methode?

Ich erstelle eine abstrakte Klasse für einen Spark-Streaming-Auftrag in einem benutzerdefinierten internen Framework, das erfordert, dass einer der Parameternamen dem Namen des Kafka-Themas entspricht oder das Argument als optionales Flag übernimmt. Hier

ist die Methode in Frage:

def apply(self, sc, records): 

    if not self.FILTER_FIELDS: 
     raise Exception('SalesForceTransformStage requires FILTER_FIELDS:[_label_,[_values_]]') 

    return shipping_label \ 
     .filter(lambda rec: rec[self.FILTER_FIELDS[0]] in self.FILTER_FIELDS[1]) \ 
     .filter(self.filters) \ 
     .map(lambda rdd: format_record_keys_for_salesforce(rdd, 
                  self.SALESFORCE_FIELD_MAP, 
                  self.SALESFORCE_FIELD_LIMITS, 
                  self.INPUTS[self.INPUTS.keys()[0]])) \ 
     .map(self.mappers) \ 
     .map(self.OUTPUT.project_row) 

Gerade jetzt, der Parameter records wird als optionaler Flag aufgenommen, so dass, wenn ich das Skript ausführen, geschieht dies:

usage: new_shipping_label_event.py [-h] [--force-rebuild] --records RECORDS 
           [--save-to SAVE_TO] 
new_shipping_label_event.py: error: argument --records is required 

Wenn Sie jedoch den Argumentnamen auf shipping_label (der Name des Kafka-Themas) ändern, wird das Skript ordnungsgemäß ausgeführt. Wie kann ich den Namen eines Parameters programmgesteuert festlegen?

+0

Kann ich schlage vor, Sie definieren diejenigen 'vor der Zeit lambda's (möglicherweise private Methoden), so dass die Filterung nicht eine einzige„Linie“ist, die 9 muss über lesbar sein überspannt. –

+0

Nein, warum sollte das besser lesbar sein? –

+0

Ist das ein Beispiel oder die eigentliche Funktion? Ich nahm an, dass das tatsächliche komplizierter war und die mehreren Filterungen darin eingebettet wurden, aber wenn das die gesamte Methode ist, dann vergiss es. –

Antwort

2

Geben Sie records einen Standardwert, so dass es optional ist.

def apply(self, sc, records=None): 
+0

Nein, dies optional zu machen, bedeutet nichts, da die Super-Klasse überprüft, ob Argumente mit Kafka-Themennamen übereinstimmen. Ich dachte, ich hätte das klar genug gemacht. –

+0

können Sie mehr Code, wie die Implementierung der Klasse –

+0

setzen Wahrscheinlich nicht? Just cus dies sind intern aufgebaute Spark-Streaming-Frameworks. Alles, was Sie wissen müssen, ist, dass die Signatur der Methode apply die Form '(self, sc, * kafka topic name *) haben muss. –