Python - 使用布尔值的安全索引
Python - Safe Indexing with boolean
我有一些代码 returns 来自列表的值。我正在使用强类型遗传编程(使用出色的 DEAP 模块),但我意识到 1
& 0
与 True
和 False
相同。这意味着函数需要一个整数,它可能以布尔函数结束,这会导致一些问题。
例如:
list = [1,2,3,4,5]
list[1]
returns 2
list[True]
也 returns 2
是否有 Pythonic 方法来防止这种情况?
您可以定义自己的不允许布尔索引的列表:
class MyList(list):
def __getitem__(self, item):
if isinstance(item, bool):
raise TypeError('Index can only be an integer got a bool.')
# in Python 3 use the shorter: super().__getitem__(item)
return super(MyList, self).__getitem__(item)
创建实例:
>>> L = MyList([1, 2, 3])
一个整数有效:
>>> L[1]
2
但是True
没有:
>>> L1[True]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-888-eab8e534ac87> in <module>()
----> 1 L1[True]
<ipython-input-876-2c7120e7790b> in __getitem__(self, item)
2 def __getitem__(self, item):
3 if isinstance(item, bool):
----> 4 raise TypeError('Index can only be an integer got a bool.')
TypeError: Index can only be an integer got a bool.
相应地覆盖 __setitem__
以防止使用布尔值作为索引来设置值。
我有一些代码 returns 来自列表的值。我正在使用强类型遗传编程(使用出色的 DEAP 模块),但我意识到 1
& 0
与 True
和 False
相同。这意味着函数需要一个整数,它可能以布尔函数结束,这会导致一些问题。
例如:
list = [1,2,3,4,5]
list[1]
returns 2
list[True]
也 returns 2
是否有 Pythonic 方法来防止这种情况?
您可以定义自己的不允许布尔索引的列表:
class MyList(list):
def __getitem__(self, item):
if isinstance(item, bool):
raise TypeError('Index can only be an integer got a bool.')
# in Python 3 use the shorter: super().__getitem__(item)
return super(MyList, self).__getitem__(item)
创建实例:
>>> L = MyList([1, 2, 3])
一个整数有效:
>>> L[1]
2
但是True
没有:
>>> L1[True]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-888-eab8e534ac87> in <module>()
----> 1 L1[True]
<ipython-input-876-2c7120e7790b> in __getitem__(self, item)
2 def __getitem__(self, item):
3 if isinstance(item, bool):
----> 4 raise TypeError('Index can only be an integer got a bool.')
TypeError: Index can only be an integer got a bool.
相应地覆盖 __setitem__
以防止使用布尔值作为索引来设置值。