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

RBu*_*ntu 41 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"
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清未来的访问者,我只需要处理3个案例,正确的答案可以处理所有3个案例而不需要任何额外的填充.

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

  2. dict[key]存在并指向空字符串.TextString换成了"N/A".

  3. dict[key]不存在.TextString换成了"N/A".

pzp*_*pzp 67

dict.get()如果存在,则使用它将返回与给定键关联的值None.(注意,''并且None都是假值.)如果s为true,则将其赋值给它,nObject.TextString否则给它一个值"N/A".

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

  • 但是如果键返回0怎么办?0是有效的"N/A"分配吗? (16认同)
  • 我认为这个答案"个人太聪明"了. (11认同)
  • @rlbond你的意思太聪明了吗?它清晰而有效,初读时意图很明显. (6认同)
  • 现在,这很棒 (3认同)
  • @MooingRawr OP未指明这一点,但这是一个潜在的问题.然而,据推测,字典中的所有值都是相同的类型(即`str`),因为这只是一般的好习惯,而我们分配的变量是`TextString`. (2认同)
  • @rlbond我会把它作为一种恭维,谢谢!;) (2认同)
  • @ njzk2我想你明确希望''''被替换为''N/A'`是不明显的.稍后阅读代码的人可能会认为这是一个错误. (2认同)

not*_*.no 17

使用get()词典功能.None如果密钥不存在,或者如果指定第二个值,它将返回,它将其设置为默认值.然后你的语法将如下所示:

nObject.TextString = self.var.jobDetails.get('Overall Weight', 'N/A')
Run Code Online (Sandbox Code Playgroud)

  • 这不处理*字典键为空**值为空字符串的情况 (4认同)
  • @pzp`nObject.TextString`被分配给一个空字符串,这不是OP想要的 (2认同)

ele*_*han 9

使用.get()具有默认参数"N/A"其中如果该键不存在,将用于:

nObject.TextString = self.var.jobDetails.get("Overall Weight", "N/A")
Run Code Online (Sandbox Code Playgroud)

更新

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

nObject.TextString = self.var.jobDetails.get("Overall Weight") or "N/A"
Run Code Online (Sandbox Code Playgroud)

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