我有一段代码在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个案例,而不需要任何额外的填充。
dict[key]
存在并指向非空字符串。 TextString
已替换为分配给dict[key]
的值。
dict[key]
存在并指向空字符串。 TextString
已替换为"N/A"
。
dict[key]
不存在。 TextString
已替换为"N/A"
。
答案 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 and
和or
操作返回其最后计算的值,而不是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'