Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python if/else和try/except组合,无冗余_Python_Python 3.x_If Statement_Try Except - Fatal编程技术网

python if/else和try/except组合,无冗余

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表达式

在玩游戏时,我编写了以下代码行

如果调试: 尝试: 从冰淇淋进口 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式的方法来处理这个想法,而不需要冗余。

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)