是否有更多的Pythonic方法来结合一个Else:声明和一个Except:?

我有一段代码在AutoCAD中search包含特定关键字的文本框(例如在本例中为"overall_weight" ),并将其replace为字典中的值。 但是,有时字典键被分配给一个空string,有时候,键不会完全存在。 在这些情况下, "overall_weight"关键字应该replace为"N/A" 。 我想知道如果有更pythonic的方式来结合nObject.TextString = "N/A"exception和else都去nObject.TextString = "N/A"所以它没有input两次。

 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]存在并指向一个非空string。 TextStringreplace为分配给dict[key]的值。

  2. dict[key]存在,并指向一个空string。 TextStringreplace为"N/A"

  3. dict[key]不存在。 TextStringreplace为"N/A"

使用dict.get() ,否则返回与给定键相关的值。 (请注意, ''None都是错误的值。)如果s为真,则将其分配给nObject.TextString否则给它一个值"N/A"

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

为词典使用get()函数。 如果该键不存在或者如果指定第二个值,它将返回None ,它会将其设置为默认值。 那么你的语法将如下所示:

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

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

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

更新

如果需要处理空string,只需修改如下:

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

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

我认为这是事先设置默认值的好例子

 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 

根本性的思考

沟首先回答(只是保持它,因为它得到了upvote)。 如果你真的想pythonic,(你总是想在TextString上设置一个值)replace整个事情

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

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

Python的禅说:“显式比隐式更好”。 根据我自己的经验,我发现这是非常真实的。 当我写一段代码的时候,我觉得“我能明白一年之后这意味着什么吗?” 如果答案是“否”,则需要重新编写或logging。 被接受的答案依赖于记住dict.get的实现来知道它将如何处理angular落案例。 由于OP有3个明确的标准,我将把它们清楚地logging在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" 

这当然更详细…但这是一件好事。 阅读这个行为将是什么时候没有问题。

如何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'