1

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

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 很乐意匹配并为我进行更改。

哇?!

这是一个简单的改变,我不介意做,但我想理解。

把一切都搞砸的连字符是什么?我们不是只是在这里进行字符串匹配,还是在引擎盖下发生了我没想到的事情?

4

1 回答 1

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
于 2013-04-11T12:07:37.387 回答