是否有更多Pythonic方式结合Else:声明和除外:?

时间:2016-10-06 18:29:52

标签: python python-2.7

我有一段代码在AutoCAD中搜索包含某些关键字的文本框(例如,在这种情况下为"overall_weight"),并将其替换为字典中的值。但是,有时字典键被分配给空字符串,有时,密钥并不完全存在。在这些情况下,"overall_weight"关键字应替换为"N/A"。我想知道是否有一种更加pythonic的方式将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个案例,正确的答案可以处理所有3个案例,而不需要任何额外的填充。

  1. dict[key]存在并指向非空字符串。 TextString已替换为分配给dict[key]的值。

  2. dict[key]存在并指向空字符串。 TextString已替换为"N/A"

  3. dict[key]不存在。 TextString已替换为"N/A"

6 个答案:

答案 0 :(得分:67)

使用dict.get(),如果存在,则返回与给定密钥关联的值,否则为None。 (请注意,''None都是假值。)如果s为真,则将其分配给nObject.TextString,否则将其赋值为"N/A"。< / p>

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

答案 1 :(得分:17)

使用get()函数进行词典。如果密钥不存在,或者如果指定第二个值,它将返回None,它会将其设置为默认值。然后您的语法将如下所示:

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

答案 2 :(得分:9)

使用.get()的默认参数"N/A",如果密钥不存在,将使用该参数:

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

更新

如果需要处理空字符串,只需修改如下:

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

如果引发nObject.TextString,或者检索到的值为空,则会将KeyError设置为“N / A”:''[]等。

答案 3 :(得分:3)

我认为这是提前设置默认值的好例子

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

放弃第一个回答(只是保留它,因为它有一个upvote)。如果你真的想去pythonic,(你总是想在TextString上设置一个值)用

替换整个东西
nObject.TextString = (nObject.TextString == "overall_weight"
    and self.var.jobDetails.get("Overall Weight")
    or "N/A")

Python andor操作返回其最后计算的值,而不是True / False,您可以使用它来遍历组合。

答案 4 :(得分:2)

Python的禅说&#34;明确比隐含更好。&#34;我发现这在我自己的经历中是非常真实的。当我写一段代码时,我想到了自己,&#34;我能理解一年后这意味着什么?&#34;如果答案是&#34;否&#34;然后需要重新编写或记录。接受的答案依赖于记住dict.get的实现,以了解它将如何处理极端情况。由于OP有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"

它当然更加冗长......但这是一件好事。毫无疑问,阅读此行为将是什么。

答案 5 :(得分:-2)

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'