2016-04-29 3 views
-1

Я получил вызов о устаревших параметрах в веб-приложении. Я видел этот пост ...Python - передать названные аргументы объекту функции

wtforms+flask today's date as a default value

... который был на месте.

По умолчанию значение поля устанавливалось при запуске веб-сервера. Это было легко проверить. Несколько утверждений печати в файле, и это было доказано.

Итак, теперь вопрос старшего инженера-программиста: «Как передать параметры в?».

Итак ...

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

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

Но старший инженер-программист хотел бы, чтобы иметь возможность встраивать аргументы функции в то время он назначен как ...

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

. .. но без непосредственного обращения к нему. В принципе, хранение объекта функции и его аргументов без их выполнения, все еще откладывается, чтобы код выполнялся при загрузке страницы, а не на старте сервера.

В настоящее время у нас есть две идеи.

  1. Старший инженер-программист рассматривает возможность обертывания метода вокруг метода. Итак, есть один основной метод, а затем множество других, специфичных для сценариев, таких как myfuncminus10
  2. Я думаю о лямбда-выражениях. Что-то вроде myfunc = lambda: datetime.now(). Date() - timedelta (days = 365) Это определенно даст ожидаемый результат, но это может привести к большому копированию и вставке того же кода.

Каков наилучший способ приблизиться к этому? Я полагаю, что есть довольно хороший способ, который не является одним из двух способов, которые я только что описал, и мы пока еще этого не знаем.

+0

В течение минуты 3 ответа для 'functools.partial'. Я удалю шахту. – AKS

+0

Также смотрите: [Частичное приложение] (https://en.wikipedia.org/wiki/Partial_application) и [Currying] (https://en.wikipedia.org/wiki/Currying) –

ответ

2

Опишите существующую функцию - functools.partial:

from functools import partial 

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

awesome! спасибо за головы. Как это соотносится с выражением lamda, опубликованным Alex Hall ниже? – MrGoodfix

+0

Существуют некоторые тонкие (ранние/поздние связывание/связанные с фреймом) различия (см., Например, [этот поток] (http://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessary) для справки), но для рассматриваемого дела я вполне уверен, что вы можете использовать любой из них, не замечая разницы. – schwobaseggl

+0

человек, мне жаль, что существует способ отметить несколько ответов как «ответ» – MrGoodfix

1

Вы можете легко создать вызываемая без аргументов, просто предваряя с lambda:, а именно:

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

Ха-ха, хорошо! похоже, я пропустил очевидный вариант. Есть ли какое-либо преимущество в том, чтобы делать это таким образом, используя частичное из functools, указанное выше? – MrGoodfix

+0

Я лично считаю это более читаемым, но другие, похоже, не согласны. –

+0

человек, я хочу, чтобы был способ отметить несколько ответов как «ответ» – MrGoodfix

Смежные вопросы