2016-01-21 3 views
1

Использование Python 2.7.11Unicode Дэш не обнаруживается, если заявление

черточек из UTF-8 документа я читал в настоящее время игнорируются, если заявления предназначены для их обнаружения. Тире печатается на консоли как символ «-», а когда отображается как представление, отображается как u'- ». Символ, переданный через ord(), отображает порядковый номер 45, который совпадает с тире.

segment = line[:section_widths[row_index]].strip() 
line = line[section_widths[row_index]+1:] 
if segment: 
    print 'seg' 
    if segment is u'-' or segment is '-': 
     print 'DASH DETECTED' 
     continue 
    print "ord %d" % ord(segment[0]) 
+0

Предполагаю, что это должно быть персонажем 45 (что Юникод называет «HYPHEN-MINUS»), а не, например, EN DASH (u + 2013) или EM DASH (u + 2014). –

+0

Да, исходный текст был символом «HYPHEN-MINUS», хотя в документе он использовался в качестве заполнителя, подобно эллипсам. – eadsjr

ответ

1

Не используйте is для проверки равенства. Для проверки равенства используйте ==.

>>> 'stringstringstringstringstring' == 'string' * 5 
True 
>>> 'stringstringstringstringstring' is 'string' * 5 
False 

is следует использовать для проверки личности.

0

Оказывается, что Python 2.7.x на «это» не имеет те же эффекты для Юникода строк, как это делает для ASCII них. Это различие в основном объясняется здесь: [String comparison in Python: is vs. ==]

Каждая строка в Юникоде является объектом, и этот объект не совпадает с тем, который используется для литералов в формате Юникод.

>>> uni = unicode('unicode') 
>>> uni == 'unicode' 
True 
>>> uni is 'unicode' 
False 
>>> 
>>> asc = str('ascii') 
>>> asc == 'ascii' 
True 
>>> asc is 'ascii' 
True 

EDIT:

Как Марк Tolonen отметил, что это не соответствует поведению.

>>> x=1 
>>> x is 1 
True 
>>> x=10000 
>>> x is 10000 
False 

(Run на Python 2.7.11 | Anaconda 2.4.0 (x86_64) | (по умолчанию, 6 декабря 2015, 18:57:58) [GCC 4.2.1 (Apple Inc. построить 5577)] на darwin)

+1

Не полагайтесь на это. Реализация Python может кэшировать неизменяемые объекты, но это необязательно. Попробуйте 'x = 1', тогда' x равен 1' против 'x = 10000', тогда' x равно 10000'. На CPython первая, вероятно, будет True, а вторая, скорее всего, будет False. –

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