Эквивалент .presence в Python - PullRequest
       49

Эквивалент .presence в Python

0 голосов
/ 15 марта 2019

Итак, я уже некоторое время использую Ruby on Rails, и мне интересно, есть ли что-то вроде .presence в Python / Django.

Присутствие возвращает получателя, если он присутствует, в противном случае возвращает nil.

object.presence эквивалентно:

object.present? ? object : nil

Например, что-то вроде:

state   = params[:state]   if params[:state].present?
country = params[:country] if params[:country].present?
region  = state || country || 'US'
becomes

region = params[:state].presence || params[:country].presence || 'US'

Anthony

1 Ответ

3 голосов
/ 15 марта 2019

В Python вы можете достичь этого, выполнив следующее, предполагая, что params является dict:

state = params.get('state')
country = params.get('country')
region = 'US' if (state and country) else None

Метод dict.get(key) вернет значение, связанное с ключом, который былпрошло.Если такого ключа не существует, он возвращает None.

. Если вам нужно заменить пустые значения фактическими пустыми строками, вы можете сделать это вместо этого:

state = params.get('state', '')
country = params.get('country', '')
region = 'US' if (state and country) else ''

В целом, "Pythonic "способ сделать это состоит в том, чтобы использовать форму:

class Address(Model):
    state = ...
    country = ...
    region = ...

AddressForm = modelform_factory(Address)

#inside view
def view(request):
    if request.method == 'POST':
        form = AddressForm(request.POST, request.FILES)

        if form.is_valid():
            address = form.save(commit=False)
            address.region = 'US' if address.state and address.country
            address.save()

Создав собственный класс AddressForm, вы можете выполнить эту обработку автоматически на экземпляре перед его сохранением.Это точная роль классов Form.

...