dict.has_key(somekey) 与 somekey in dict 的效果不同

0 投票
2 回答
1117 浏览
提问于 2025-04-17 16:21

我最近在用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

撰写回答