dict.has_key(somekey) 与 somekey in dict 的效果不同
我最近在用BeautifulSoup玩Python字典的时候遇到了一个奇怪的问题。我的代码是这样的:
import urllib2
from BeautifulSoup import BeautifulSoup
response = urllib2.urlopen("http://www.msn.com")
html = response.read()
soup = BeautifulSoup(html)
anchors = soup.findAll('a')
for a in anchors:
if not a.has_key('href') == 'href' in a:
print a
结果打印出了很多链接,其中has_key的表现和'in'不一样。
有没有人能解释一下?非常感谢!
2 个回答
1
这段话是关于操作符优先级的:
>>> a = {'a': 5, 'b': 6}
>>> a.has_key('a')
True
>>> 'a' in a
True
>>> a.has_key('a') == 'a' in a
False
>>> a.has_key('a') == ('a' in a)
True
>>> (a.has_key('a') == 'a') in a
False
所以在你的例子中
if not a.has_key('href') == 'href' in a:
print a
实际上是指
if not (a.has_key('href') == 'href') in a:
print a
而你想要检查的是
if not a.has_key('href') == ('href' in a):
print a
另外,关于不再支持has_key这个方法的问题,在Python 3中已经不推荐使用这个方法。如果可以的话,建议你直接放弃Python 2,选择使用3.x版本。
4
你可能想要的是:
if not a.has_key('href'):
或者有一种更符合Python风格的方法来检查这个:
if 'href' not in a:
has_key()
的用法和 in
关键字类似(其他回答提到过,你忘记加括号了),但是 has_key()
已经被 弃用,在Python 3.x中不再支持。所以你应该始终使用 in
。