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
- 如果不调试代码或
- 如果导入冰淇淋不起作用
我想知道是否有一种(也许是 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
在玩 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
- 如果不调试代码或
- 如果导入冰淇淋不起作用
我想知道是否有一种(也许是 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