如果'dialog-bmp'是'dialog-bmp',Python返回false

时间:2013-04-11 12:06:06

标签: python python-2.7

在这里学习机会。我有一种情况,我正在更新文件中的某些属性。我有一个更新文件的函数:

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?!

这是一个很容易的变化,我不介意制作它,但我想了解。

什么是连字符吹响了一切?我们不仅仅是在这里进行字符串匹配,还是在我不期待的引擎盖下发生了什么?

1 个答案:

答案 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