2015-07-18 4 views
0

Я использовал лямбду несколько раз. При чтении этого учебника django-autoslugчто использовать лямбда в этом случае

есть два примера:

slug = AutoSlugField(populate_from='title') 

и более сложным:

slug = AutoSlugField(populate_from=lambda instance: instance.title, 
         unique_with=['author__name', 'pub_date__month'], 
         slugify=lambda value: value.replace(' ','-')) 

Я заинтересован в этой строке: populate_from='title' и populate_from=lambda instance: instance.title Какая разница? И можете ли вы дать некоторый учебник (а не документацию) с примерами lambda?

+1

Собственный учебник Python: https://docs.python.org/2/tutorial/controlflow.html#lambda-expressions. * «Я использовал лямбду несколько раз» * - и вы не знаете, что он делает? – jonrsharpe

+0

Из строки 'populate_from' docs или вызываемой: если строка задана, она считается именем атрибута, из которого следует заполнить пул. Если задан вызываемый, он должен принять параметр экземпляра и вернуть значение, чтобы заполнить пул. «Http://pythonhosted.org/django-autoslug/fields.html – freakish

+2

, что должно означать, что нет разницы между« заголовком », 'и' lambda instance: instance.title' здесь. – L3viathan

ответ

0

Python's lambda - это просто быстрый однострочный способ создания функции. Это было бы эквивалентно:

def slugFunction(someInstance): 
    return someInstance.title 

slug = AutoSlugField(populate_from=slugFunction) 

Вы можете также сделать слизняк, что это не имеет ничего общего с полем модели. Например, вы могли бы использовать эпохи:

import time 

slug = AutoSlugField(populate_from=lambda i: return str(time.time())) 

(Обратите внимание, что AutoSlugField всегда будет проходить экземпляр модели функции, поэтому ваша функция должна принимать один аргумент, даже если он не использует его.)

В 99% случаев вы, вероятно, заложите пул в поле модели, так что для этого есть ярлык. У AutoSlugField никогда не было достаточно встроенных функций для обработки других вариантов использования, поэтому он позволяет вам самостоятельно определять функцию.

Их документация сбивает с толку, поскольку они иллюстрируют один и тот же вариант использования двумя разными способами. - Как указывает L3viathan в комментариях выше, нет никакой разницы между 'title' и lambda instance: instance.title.

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