2016-04-29 19 views
-1

Ich erhielt einen Anruf über veraltete Parameter in einer Web-App. Ich sah diesen Beitrag ...Python - Pass benannte Argumente zu Funktionsobjekt

wtforms+flask today's date as a default value

... das war genau richtig.

Die Standardeinstellung des Feldes wurde beim Start des Webservers festgelegt. Es war einfach zu testen. Ein paar Druckanweisungen in der Datei und es wurde bewiesen.

Jetzt lautet die Frage des leitenden Softwareentwicklers: "Wie übertrage ich Parameter?".

Also dann ...

myfunc(offset=3): 
    .... some code 

fromdate = fields.DateField('From Date', default=myfunc, validators=[validators.required()]) 

Aber der Senior Software Engineer möchte in der Lage sein, Argumente zu der Zeit auf die Funktion Inline es wie ...

zugeordnet
fromdate = fields.DateField('From Date', default=myfunc(-10), validators=[validators.required()]) 

. .. aber ohne es sofort aufzurufen. Im Grunde, das Funktionsobjekt und seine Argumente speichern, ohne sie auszuführen, immer noch verzögern, so dass der Code beim Laden der Seite statt beim Start des Servers ausgeführt wird.

Derzeit haben wir zwei Ideen.

  1. Der leitende Softwareentwickler sucht nach einer Methode um die Methode zu wickeln. Also dann gibt es eine Kernmethode und dann eine Reihe anderer, die szenariospezifisch sind, wie zum Beispiel myfuncminus10
  2. Ich denke Lambda-Ausdrücke. So etwas wie myfunc = Lambda: datetime.now(). Date() - timedelta (days = 365) Es würde definitiv das beabsichtigte Ergebnis produzieren, aber es könnte viel Code kopieren und einfügen.

Was ist der beste Weg, um dies zu nähern? Ich bin der Meinung, dass es einen ziemlich guten Weg gibt, der nicht einer der zwei Wege ist, die ich gerade beschrieben habe und wir wissen es noch nicht.

+0

Innerhalb einer Minute 3 Antworten für 'functools.partial'. Ich werde meine löschen. – AKS

+0

Siehe auch: [Partielle Anwendung] (https://en.wikipedia.org/wiki/Partial_application) und [Currying] (https://en.wikipedia.org/wiki/Cryrying) –

Antwort

2

Sie beschreiben eine vorhandene Funktion - functools.partial:

from functools import partial 

fromdate = fields.DateField('From Date', default=partial(myfunc, offset=-10), validators=[validators.required()]) 
+0

genial! Danke für die Köpfe hoch. Wie ist das mit dem Lambda-Ausdruck von Alex Hall unten zu vergleichen? – MrGoodfix

+0

Es gibt einige subtile (frühe/späte Bindung/Stack-Frame bezogene) Unterschiede (lesen Sie zB [this thread] (http://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessary) als Referenz), aber für den vorliegenden Fall bin ich ziemlich sicher, dass Sie beide verwenden können, ohne einen Unterschied zu bemerken. – schwobaseggl

+0

Mann, ich wünschte, es gäbe eine Möglichkeit, mehrere Antworten als "die" Antwort zu markieren – MrGoodfix

1

Sie können ganz einfach eine aufrufbare ohne Argumente nur um das Voranstellen mit lambda:, dh erstellen:

fromdate = fields.DateField('From Date', default=lambda: myfunc(-10), validators=[validators.required()]) 
+0

Haha, nett! Es sieht so aus, als hätte ich eine offensichtliche Option übersehen. Gibt es einen Vorteil gegenüber der oben genannten Verwendung von partiellen Funktionen? – MrGoodfix

+0

Ich persönlich finde das viel lesbarer, aber andere scheinen nicht zu stimmen. –

+0

Mann, ich wünschte, es gab eine Möglichkeit, mehrere Antworten als "die" Antwort zu markieren – MrGoodfix