在这里学习机会。我有一种情况,我正在更新文件中的某些属性。我有一个更新文件的函数:
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
&amp;之外,所有条件都很好。 banner-bmp
。由于某些我无法理解或发现的原因,条件就不匹配了。如果我将属性和条件更改为dialog
,python很乐意匹配并为我做出更改。
WAT?!
这是一个很容易的变化,我不介意制作它,但我想了解。
什么是连字符吹响了一切?我们不仅仅是在这里进行字符串匹配,还是在我不期待的引擎盖下发生了什么?
答案 0 :(得分:2)
永远不要使用is
来检查是否相等(它会检查对象标识)!请改用==
:
if property == "version":
...
elif property == "brand":
...
etc.
is
可能适用于实习/缓存的短字符串,但前提是它们只包含对Python标识符有效的字符(&#34;变量名称&#34;)。你的程序就是一个很好的例子:
>>> 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