我已经将内置Python列表子类化了。
在if结构中,空列表将评估为false,但我希望我的子类计算为true。
是否有可用的dunder方法可以在我的子类中覆盖以更改此行为?
答案 0 :(得分:0)
根据Python datamodel documentation, for the object.__nonzero__
method,这是可行的(但它会违反rule of least surprise, or principle of least astonishment):
被要求实施真值测试和内置操作 布尔();应该返回False或True,或者它们的整数等于0或 1.如果未定义此方法,则调用 len ()(如果已定义),如果对象的结果非零,则认为该对象为true。 如果一个类既没有定义 len ()也没有定义非零(),那么 实例被认为是真实的。
因此假设,我们可以检查len()== 0并返回True,如果是, 然后使用默认值进行布尔检查:
class FunkyList(list):
def __nonzero__(self):
if self.__len__() == 0:
return True
else:
return self.__len__()
__bool__ = __nonzero__ # Python 3 uses __bool__ instead of __nonzero
但由于逻辑树的两种情况都会导致bool为True,因此上述内容可以简化为:
class FunkyList(list):
def __nonzero__(self):
return True
__bool__ = __nonzero__ # Python 3 uses __bool__ instead of __nonzero
我们认为它有效并且看起来像一个列表:
>>> fl = FunkyList()
>>> fl
[]
>>> isinstance(fl, list)
True
现在空FunkyList的bool()返回True
>>> bool(fl)
True
它可以在不破解__len__
方法的情况下实现这一点。
>>> len(fl)
0
无论如何,我不明白为什么你想要一个len 0列表返回True。
感谢这样一个有趣的问题,但我希望这个问题是学术性的,而不是实际问题。执行此检查是Python的惯用语:
>>> if fl:
... print True
...
True
任何有Python经验的人都希望如果列表为空则返回False,而实现这一点的结果可能会让任何用户对你不满意。
答案 1 :(得分:-4)
我不知道它对你有帮助,但我试过了...... list_1 = [[“a”,“b”]]其中''list_1'是列表名称,'[“a”,“b”]'是列表的子集。 如果你执行以下代码
list_1 = [["a","b"]];
if "a" in list_1:
print ("true");
else:
print ("false");
会给你“假”.....
如果您执行此代码
list_1 = [["a","b"]];
if "a" in list_1[0]:
print ("true");
else:
print ("false");
它会给你“真实”
通过这种方式,您可以访问列表中的子列表...