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

python if/else and try/except combination without redundancy

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

if __debug__:
    try:
        from icecream import ic
        ic.configureOutput(includeContext=True)
    except ImportError:  # Graceful fallback if IceCream isn't installed.
        ic = lambda *a: None if not a else (a[0] if len(a) == 1 else a)  # noqa
else:
    ic = lambda *a: None if not a else (a[0] if len(a) == 1 else a)  # noqa

如您所见,我想在两种情况下都将(相同的)lambda 表达式分配给 ic

  1. 如果不调试代码或
  2. 如果导入冰淇淋不起作用

我想知道是否有一种(也许是 pythonic 的)方法来处理这个想法而没有冗余。

deceze 在评论中建议的模式略有不同:

# file my_icecream.py:
def ic(*a):
    """Icecream fallback implementation"""
    if not a:
        return None
    elif len(a) == 1:
        return a[0]
    else:
        return a
# original file
if not __debug__:
    from my_icecream import ic
else:
    try:
        from icecream import ic
        ic.configureOutput(includeContext=True)
    except ImportError:
        from my_icecream import ic

您可以定义一个默认值,然后根据需要覆盖它。我还要添加评论以使其清楚。

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 成功时应该发生的情况。

这是基于deceze's