Условный ключ в словаре - python

У меня есть функция create_group с необязательным параметром user_device=None. Если для user_device указано значение, отличное от None, я хочу, чтобы словарь targeting_spec включал пару ключ-значение "user_device": user_device, а если не указано значение, отличное от None, я не хочу, чтобы targeting_spec включал эту пару ключ-значение.

Как я это делаю сейчас:

def create_group(..., user_device=None, ...):
    ...
    targeting_spec = {
        ...
    }
    if user_device:
        targeting_spec["user_device"] = user_device
    ...

Это принятый способ сделать это? Если нет, то что? Я спрашиваю, потому что это похоже на то, что Python хотел бы решить элегантно.


person tscizzle    schedule 11.07.2014    source источник
comment
Это не установит parameters[user_device] в user_device, если user_device является чем-то, что оценивается как False в логическом контексте, отличном от None, например, пустая строка, 0, пустой список или кортеж и т. д. Если вы не хотите такого поведения, измените свой чек на if user_device is not None.   -  person timgeb    schedule 11.07.2014
comment
Кажется, нет ничего плохого в этом способе сделать это. Хотя вы можете просто ввести его в parameters как None. Пока вы учитываете, что это None вниз по линии, оно должно работать нормально в любом случае.   -  person kylieCatt    schedule 11.07.2014
comment
О, хороший момент. Оказывается, если бы это была какая-либо из этих вещей, я бы все равно не хотел, чтобы user_device в target_spec, поэтому мое утверждение Если указано значение, отличное от None..., не было технически точным, потому что такие вещи, как или [] мне также не нужны, ( вроде нет). Я отредактирую и исправлю имена переменных, чтобы они соответствовали описанию.   -  person tscizzle    schedule 11.07.2014
comment
На самом деле я выберу не-None и, таким образом, изменю чек на if user_device is not None:, но это серьезная проблема, которую я раньше не принимал во внимание.   -  person tscizzle    schedule 11.07.2014
comment
было бы неплохо, если бы вы могли сделать что-то вроде {'key1': value1, 'key2': value2 if value2, 'key3': value3}   -  person Ariel    schedule 31.08.2017
comment
Можно ли сделать это таким образом, чтобы targetting_spec был изменчивым?   -  person Awais Hussain    schedule 03.05.2018


Ответы (1)


Ваш подход хорош, при условии, что вам не нужно поддерживать пустые значения.

Рассмотрим, например, передачу user_device=0. user_device не является None, но является ложным значением.

Если вам нужно поддерживать ложные значения отдельно от None, используйте is not None для проверки:

if user_device is not None:
    parameters["user_device"] = user_device
person Martijn Pieters    schedule 11.07.2014