2013-04-11 4 views
1

Возможность обучения здесь. У меня есть ситуация, когда я обновляю некоторые свойства в файле. У меня есть функция, которая обновляет файл:Python возвращает false для if 'dialog-bmp' is 'dialog-bmp'

def update_tiapp(property, value): 
    print 'update_tiapp: updating "%s" to "%s"' % (property, value) 
    for line in fileinput.input(os.path.join(app_dir, 'tiapp.xml')): # , inplace=True 
    if property is 'version': 
     line = re.sub(r'(<version>).*?(</version>)', '\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE) 
    elif property is 'brand': 
     line = re.sub(r'(<property name="brand" type="string">).*?(</property>)', '\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE)'\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE) 
    elif property is 'banner-bmp': 
     line = re.sub(r'(<banner-bmp>).*?(</banner-bmp>)', '\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE) 
    elif property is 'dialog-bmp': 
     line = re.sub(r'(<dialog-bmp>).*?(</dialog-bmp>)', '\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE) 
    elif property is 'url': 
     line = re.sub(r'(<url>).*?(</url>)', '\g<1>%s\g<2>' % value, line.strip(), flags=re.IGNORECASE) 

Все условия являются штраф за исключением dialog-bmp & banner-bmp. По какой-то причине, что я не могу понять или найти, условие просто не будет соответствовать. Если я изменю свойство и условие на dialog, python рад соответствовать и внести изменения для меня.

WAT ?!

Это легкое изменение, и я не против его создания, но я хотел бы понять.

Что это за дефис, который взрывает все? Разве мы не просто подбираем здесь строку, или что-то происходит под капотом, чего я не ожидал?

ответ

2

Никогда не используйте is для проверки равенства (он проверяет идентификатор объекта)! Используйте == вместо:

if property == "version": 
    ... 
elif property == "brand": 
    ... 
etc. 

is может работать для коротких строк, которые интернированных/кэшированных, но только если они не содержат ничего, кроме символов, которые будут действительны для идентификатора Python (а «имя переменной»). Ваша программа является прекрасным примером для этого:

>>> a = "dialog-bmp" 
>>> b = "dialog-bmp" 
>>> a is b 
False 
>>> id(a) 
32571184L 
>>> id(b) 
32571088L 
>>> a = "brand" 
>>> b = "brand" 
>>> a is b 
True 
>>> id(a) 
32610664L 
>>> id(b) 
32610664L 
+0

Ah. Просто изучая Python, и казалось, что это «есть», это то, что я видел во всех примерах. Спасибо за образование. –

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