python if/else和try/except组合,无冗余
在玩游戏时,我编写了以下代码行 如果调试: 尝试: 从冰淇淋进口 ic.configureOutputingCludeContext=True 除了importorror:如果没有安装冰激凌,则可以使用优雅的回退。 ic=lambda*a:None如果不是a else a[0]如果lena==1 else a noqa 其他: ic=lambda*a:None如果不是a else a[0]如果lena==1 else a noqa 正如您所看到的,在这两种情况下,我希望将相同的lambda表达式分配给ic 如果不调试代码或 如果进口冰淇淋不起作用python if/else和try/except组合,无冗余,python,python-3.x,if-statement,try-except,Python,Python 3.x,If Statement,Try Except,在玩游戏时,我编写了以下代码行 如果调试: 尝试: 从冰淇淋进口 ic.configureOutputingCludeContext=True 除了importorror:如果没有安装冰激凌,则可以使用优雅的回退。 ic=lambda*a:None如果不是a else a[0]如果lena==1 else a noqa 其他: ic=lambda*a:None如果不是a else a[0]如果lena==1 else a noqa 正如您所看到的,在这两种情况下,我希望将相同的lambda表达式
我想知道是否有一种可能是python式的方法来处理这个想法,而不需要冗余。deceze在评论中建议的模式有一点变化: 归档my_icecream.py: def ic*a: 冰淇淋回退实现 如果不是: 一无所获 elif lena==1: 返回[0] 其他: 归还
您可以定义一个默认值,然后根据需要稍后重写它。我还要补充一些评论,以澄清这一点
def ic(*a): # May be overridden later
if not a:
return None
return a[0] if len(a) == 1 else a
if __debug__:
try:
from icecream import ic # Override default
except ImportError:
pass # Fallback to default
else:
ic.configureOutput(includeContext=True)
顺便说一下:
为了更好的可读性,我重写了函数以避免使用双条件表达式。
尽量在Try子句中放入尽可能少的内容,并使用else来定义如果Try成功应该发生什么。
这是基于的ic=lambda。。。如果没有,请调试:尝试:导入。。。除了importorror:pass…?谢谢@deceze,覆盖ic定义是个好主意,但不是那个pythonic,不是吗?为什么不呢?@deceze我认为重新定义/覆盖在某种程度上是不干净的。但这只是个人的感觉。你的建议确实符合我的要求,因此是好的。如果没有进一步的解决办法,我当然会接受你的答案,如果你愿意这样写的话。或者我会通过自我回答提到你。@deceze是我根据你的评论添加的,谢谢!如果你有什么要补充的,谢谢,看起来很有趣。只是一个问题:为什么要颠倒if子句?还有更大的意义吗?此外,在my_icecream.py中,为什么要扩展一行文字?这两种文字都是纯粹的文体选择:一行文字的分解在我看来更具可读性,只要以后需要掌握/修改/调整它;但在大多数情况下,它的实现可能/应该像冰淇淋进口一样不透明。至于反转not _调试_:我发现先有默认/生产案例更干净,但是我可以很容易地说服你坚持你发布的订单。我会直接在导入旁边添加一条内联注释,使其200%清楚地表明覆盖是有意的。随着时间的推移/重构后,否则此连接可能会丢失。@ojdo补充道,谢谢!我建议在冰淇淋进口行中使用“noqa:F811-无重新定义错误”,因为这是相应的警告c。f@Ojdow经过所有的重构,这本可以成为codereview.SX:D的候选
def ic(*a): # May be overridden later
if not a:
return None
return a[0] if len(a) == 1 else a
if __debug__:
try:
from icecream import ic # Override default
except ImportError:
pass # Fallback to default
else:
ic.configureOutput(includeContext=True)