2013-07-16 2 views
0

Здесь ошибка мой питон скрипт сообщает:Discrepency между IPDB выходом и Python интерпретатор

TypeError         Traceback (most recent call last) 
/home/jhourani/openbel-contributions/resource_generator/change_log.py in <module>() 
    37   for k, v in namespaces.items(): 
    38    #ipdb.set_trace() 

---> 39    if v[0]: 
    40     v[1].append(token) 
    41 

TypeError: 'bool' object is not subscriptable 

Хорошо, вот все хорошо, я думаю. Но когда я исследую этот элемент далее в ipdb, это результат:

>>> v 
(False, []) 
>>> type(v) 
<class 'tuple'> 
>>> v[0] 
False 
>>> if v[0]: 
...  print('true') 
... else: 
...  print('false') 
... 
false 
>>> 

Условный тест работает в ipdb, но при запуске сценария интерпретатор, кажется, лечение v как логическое значение, а не как кортеж который, конечно, подлежит расшифровке. 1. Почему? 2. Почему разница между этими двумя?

Вот блок кода, который я написал:

old_entrez = [] 
old_hgnc = [] 
old_mgi = [] 
old_rgd = [] 
old_sp = [] 
old_affy = [] 
# iterate over the urls to the .belns files 
for url in parser.parse(): 
    namespaces = { 'entrez' : (False, old_entrez), 'hgnc' : (False, old_hgnc), 
        'mgi' : (False, old_mgi), 'rgd' : (False, old_rgd), 
        'swissprot' : (False, old_sp), 'affy' : (False, old_affy) } 
    open_url = urllib.request.urlopen(url) 
    for ns in namespaces.keys(): 
     if ns in open_url.url: 
      namespaces[ns] = True 
    marker = False 
    for u in open_url: 
     # skip all lines from [Values] up 
     if '[Values]' in str(u): 
      marker = True 
      continue 
     if marker is False: 
      continue 
     # we are into namespace pairs with '|' delimiter 
     tokenized = str(u).split('|') 
     token = tokenized[0] 
     for k, v in namespaces.items(): 
      ipdb.set_trace() 
      if v[0]: 
       v[1].append(token) 
+1

Возможно, вы изменили код и забыли перезагрузить его в интерпретаторе? Попробуйте перезапустить 'ipython'. –

+0

Я перезапустил, тот же результат. – Houdini

+0

Я отмечаю, что вы установили 'namespaces [ns] = True' ранее в вашем коде. Это не связано с остальным кодом вашего пространства имен. –

ответ

2

Вы изучают первой итерации, который работает отлично.

Исключение происходит позже. Шаг через цикл еще немного, потому что в какой-то момент вы запустите ключ пространства имен, для которого значение было установлено на True (не кортеж булеана и список).

Почему? Потому что раньше в вашем коде вы делаете:

for ns in namespaces.keys(): 
    if ns in open_url.url: 
     namespaces[ns] = True 

Обратите внимание на = True там; Вы, возможно, имел в виду, чтобы установить, что:

namespaces[ns] = (True, namespaces[ns][1]) 

Обратите внимание, что для цикла по ключам словаря, вы можете сделать это прямо:

for ns in namespaces: 

и сохранить себе поиск атрибутов, вызов функции, и создание целого нового объекта списка.

+0

Спасибо @Martijn, очень ценится. Также спасибо за указание, что оптимизация +1. – Houdini

Смежные вопросы