Python一行代码开关

3
我正在寻找一种更优雅的方式来完成以下操作:
py_loglevel = logging.DEBUG
if self.loglevel == "INFO":
   py_loglevel = logging.INFO
elif self.loglevel == "WARNING":
   py_loglevel = logging.WARNING
elif self.loglevel == "ERROR":
   py_loglevel = logging.ERROR

这当然可以实现,但是它让我感到不爽,因为它让我的代码显得杂乱无章,而且吸引了我的注意力,尽管它真的很微不足道。是否可以用一行代码来完成呢?


1
赞你写出优雅的代码的努力 :) - thefourtheye
3个回答

9
使用字典:
levels = {
    'INFO': logging.INFO, 
    'WARNING': logging.WARNING,
    'ERROR': logging.ERROR,
}
py_loglevel = levels.get(self.loglevel, logging.DEBUG)

或者,将名称作为模块属性查找:

py_loglevel = getattr(logging, self.loglevel, logging.DEBUG)

只要名称与模块中定义的相匹配,就可以提供。

啊,简单易懂...但是你在抄袭@User的答案。 - RickyA
@Marijn Pieters:好的,你是第一个,所以你得到了我的投票;)顺便问一下,你是荷兰人吗? - RickyA

5
py_loglevel = getattr(logging, self.loglevel)

非常优雅的“如果名称匹配”。 - RickyA

1

查看this,一种不好的方式是:

py_loglevel = logging.DEBUG
py_loglevel = (logging.INFO if self.loglevel == "INFO" else(logging.WARNING self.loglevel == "WARNING") else logging.ERROR)
print ":D"

2
考虑过了,但确实太糟糕了。 - RickyA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接