if-else优化:对多类型对象进行健全性检查



我有一个对象X,它可能是数据帧或None

我想检查X是空的还是无。

if x:
# do something

不起作用。

我有这个:

if isinstance(x, pd.DataFrame):
if x.empty:
status = False
else:
status = True
elif x is None:
status = False
else:
status = True

但这似乎是可以优化的。你有什么建议吗?

简单的try-except应该做:

status = True
x = f() # f may return a dataframe or None
try:
status = not x.empty # x.empty returns bool
except:
print("x is either None or NOT a dataframe")
status = x is not None

如果您不确定x是否是一个可能也具有属性empty的对象(不是类型pd.DataFrame(,您可以更改try:内的条件

status = not x.empty and isinstance(x, pd.DataFrame)

我们通常从基本情况开始,只有在满足某些条件时才重新赋值。这避免了额外的(并且经常重复的(else子句。在你的情况下,你可以写:

status = True
if x is None or isinstance(x, pd.DataFrame) and x.empty:
status = False

请注意,在效率方面,差异是最小的/不存在的(我们仍然检查x是否为None,以及(如果不是(它是否为DataFrame以及它是否为空(,但它更简洁,而且可以说是可读性更强。

我个人会像下面写的块一样编写代码。它完成了您想要做的事情,并删除了嵌套语句,使其可读性和目的对另一个维护者来说是直接的。

status = True
if x is None:
status = False
elif isinstance(x, pd.DataFrame) and x.empty:
status = False

如果x在不是None时保证是Dataframe,则可以删除elif检查的isistance部分。

从具体到一般:

status = isinstance(x, pd.DataFrame) and not x.empty or x is not None

最新更新