2015-11-15 1 views
2

У меня есть код, который возвращает значения из списка. Я использую строго типизированное генетическое программирование (используя отличный модуль DEAP), но я понимаю, что 1 & 0 - это то же самое, что и у True и False. Это означает, что функция ожидает целое число, это может привести к логической функции, вызывающей некоторые проблемы.Python - безопасная индексация с boolean

Например: list = [1,2,3,4,5]

list[1] возвращает 2

list[True] также возвращает 2

Есть ли Pythonic способ предотвратить это?

+1

Что вы хотите вернуть для 'data [True]' (Кстати, не называйте переменную 'list'. Python взял все хорошие имена, поэтому ставьте' my' перед вашими переменными)? – 7stud

+1

Почему вы использовали логическое значение в качестве индекса списка? – user193661

+1

Или просто проверьте тип индексной переменной с помощью 'isinstance (index, int)' и, соответственно, продолжите. –

ответ

3

Вы можете определить свой собственный список, который не позволяет булевыми индексами:

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__ соответственно, чтобы предотвратить установку значений с помощью булевых индексов.