Подтвердить что ты не робот

Есть ли более Pythonic способ объединить выражение Else: Except:?

У меня есть фрагмент кода, который ищет AutoCAD для текстовых полей, которые содержат определенные ключевые слова (например, "overall_weight" в этом случае) и заменяет его значением из словаря. Однако иногда ключевому слову слова присваивается пустая строка, а иногда ключ не существует вообще. В этих случаях ключевые слова "overall_weight" следует заменить на "N/A". Мне было интересно, есть ли более питонический способ объединить исключение KeyError, а else - перейти к nObject.TextString = "N/A", чтобы его не набирали дважды.

if nObject.TextString == "overall_weight":
    try:
        if self.var.jobDetails["Overall Weight"]:
            nObject.TextString = self.var.jobDetails["Overall Weight"]
        else:
            nObject.TextString = "N/A"
    except KeyError:
        nObject.TextString = "N/A"

Изменить: для уточнения для будущих посетителей, есть только 3 случая, о которых мне нужно позаботиться, и правильный ответ позаботится обо всех трех случаях без каких-либо дополнительных дополнений.

  • dict[key] существует и указывает на непустую строку. TextString заменено значением, назначенным dict[key].

  • dict[key] существует и указывает на пустую строку. TextString заменен на "N/A".

  • dict[key] не существует. TextString заменен на "N/A".

4b9b3361

Ответ 1

Используйте dict.get(), который вернет значение, связанное с данным ключом, если оно существует иначе None. (Обратите внимание, что '' и None - оба значения false.) Если s - true, то назначьте его nObject.TextString, иначе дайте ему значение "N/A".

if nObject.TextString == "overall_weight":
    nObject.TextString = self.var.jobDetails.get("Overall Weight") or "N/A"

Ответ 2

Используйте функцию get() для словарей. Он вернет None, если ключ не существует или если вы укажете второе значение, оно установит его как значение по умолчанию. Тогда ваш синтаксис будет выглядеть так:

nObject.TextString = self.var.jobDetails.get('Overall Weight', 'N/A')

Ответ 3

Используйте .get() с аргументом по умолчанию "N/A", который будет использоваться, если ключ не существует:

nObject.TextString = self.var.jobDetails.get("Overall Weight", "N/A")

Update

Если пустые строки нужно обрабатывать, просто измените их следующим образом:

nObject.TextString = self.var.jobDetails.get("Overall Weight") or "N/A"

Это установит nObject.TextString в "N/A", если a KeyError поднят, или если полученное значение пусто: '', [] и т.д.

Ответ 4

Я думаю, что это хороший пример для заранее заданного значения по умолчанию

if nObject.TextString == "overall_weight":
    nObject.TextString = "N/A"
    try:
        if self.var.jobDetails["Overall Weight"]:
            nObject.TextString = self.var.jobDetails["Overall Weight"]
    except KeyError:
        pass

RADICAL RETHINK

Отбросьте этот первый ответ (просто удерживая его, потому что он получил вверх). Если вы действительно хотите перейти на pythonic (и вы всегда хотите установить значение в TextString), замените все это на

nObject.TextString = (nObject.TextString == "overall_weight"
    and self.var.jobDetails.get("Overall Weight")
    or "N/A")

Операции Python and и or возвращают свое последнее вычисленное значение, а не True/False, и вы можете использовать это для прохождения через комбинации.

Ответ 5

Дзен Питона говорит: "Явный лучше, чем неявный". Я обнаружил, что это очень верно в моем собственном опыте. Когда я пишу фрагмент кода, я думаю себе: "Пойду ли я пойму, что это значит через год?" Если ответ "нет", его необходимо переписать или задокументировать. Принятый ответ основан на запоминании реализации dict.get, чтобы знать, как он будет обрабатывать угловые случаи. Поскольку ОП имеет 3 четких критерия, я бы вместо этого четко их документировал в выражении if.

if nObject.TextString == "overall_weight" and \
    "Overall Weight" in self.var.jobDetails and \
    self.var.jobDetails["Overall Weight"] != "":
    nObject.TextString = self.var.jobDetails["Overall Weight"]
else:
    nObject.TextString = "N/A"

Это, конечно, более многословное... но это хорошо. При чтении этого вопроса не возникает вопросов.

Ответ 6

Как насчет with:

key = 'Overall Weight'

with n_object.text_string = self.var.job_details[key]:
    if self.var.job_details[key] is None \
    or if self.var.job_details[key] is '' \
    or if KeyError:
        n_object.text_string = 'N/A'