我有一个对象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