2013-11-16 5 views
0

Я разработчик плагинов jython/python bukkit, и я застрял здесь. Я всегда использовал == в таких случаях, как этот, и все работало идеально. В чем проблема? Вот код:Почему == не возвращает true в этом случае?

 lastslot = event.getNewSlot() 
     iteminslot = event.getPlayer().getInventory().getItem(lastslot).getType() 
     print "Iteminslot: %s "%iteminslot 
     print "CurrentKey: %s"%currentKey 
     if clickable1 == "false": 
      log.info("clickable1 ok") 
      if iteminslot == currentKey: 
       log.info("iteminslot ok") 
       event.getPlayer().addPotionEffect(potion_effect) 

Когда я запускаю код, я получаю процесс кода в «clickable1 нормально» регистратор, поэтому он прекращает проверку, если iteminslot == currentKey ... Но когда я распечатать Iteminslot и Currentkey, они такие же!

20:41:00 [INFO] Iteminslot: DIAMOND_SWORD 
20:41:00 [INFO] CurrentKey: DIAMOND_SWORD 
20:41:01 [INFO] clickable1 ok 

Где я совершаю ошибки? Спасибо за чтение/ответ! :)

+3

Возможно, у вас есть лишние пробелы, которые вы не замечаете. Кроме того, каков их тип? Любой объект может выбрать способ его печати. Одним из них может быть объект, который не является строкой, но печатается как один. – BrenBarn

+1

Попробуйте напечатать версии 'repr'. –

+1

Вы можете проверить пробелы, как и другие предложения, используя '% r' вместо'% s'. – agf

ответ

1

Вы пытаетесь сравнить байт-строку с строкой unicode, это не всегда равно. Вы должны декодировать/кодировать их должным образом, прежде чем сравнивать:

>>> 'ć' == u'ć' 
False 
>>> 'ć' == u'ć'.encode('utf-8') 
True 
>>> 'ć'.decode('utf-8') == u'ć' 
True 

Во-вторых, как упоминалось @BrenBarn, два объекта могут напечатать в одной строке. Но это не означает, что они равны:

>>> class foo: 
    def __str__(self): 
     return 'foo' 
...  
>>> class bar: 
    def __str__(self): 
     return 'foo' 
...  
>>> print (foo()) 
foo 
>>> print (bar()) 
foo 
>>> foo == bar 
False 
+0

Если bytestring совместим с ASCII/ASCII, они будут, хотя, и мы не знаем что Iteminslot не является unicode или содержит символы, не совместимые с ASCII. – agf

+0

Я не уверен, что понимаю вас, можете ли вы представить мне пример с использованием имен, которые я использовал выше? iteminslot и currentKey ... Извините, но я начинаю код в Python: D –

+0

@ user2971511 Я думаю, что ваш случай подходит для второго примера. –

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