[pyar] BeautifulSoup y membership-test

Juan A. Diaz juan en linux.org.ar
Vie Feb 4 08:37:34 ART 2011


Hoy me encontré con este comportamiento que a mi parecer es bastante
feo.

>>> from BeautifulSoup import BeautifulSoup
>>> data="""<input id="id_cleric_focus" class="vTextField"
name="cleric_focus" maxlength="256" type="text">"""
>>> soup = BeautifulSoup(data)
>>> x = soup.find('input')
>>> x.has_key('name')
True
>>> 'name' in x
False
>>> x.__class__
<class BeautifulSoup.Tag at 0x10eb8b10>
>>> import BeautifulSoup
>>> BeautifulSoup.__version__
'3.1.0.1'
>>> 

Instale la ultima versión en un virtualenv y tuve el mismo resultado
>>> import BeautifulSoup
>>> BeautifulSoup.__version__
'3.2.0'
>>>

Como el has_key[0] nunca me callo bien y además esta deprecado, siempre
uso 'key in d'. Por otro lado, si bien ese objeto ('x') no es
precisamente un tipo standar, considero que para ofrecer consistencia
tanto 'key in d' como 'd.has_key(key) deberían retornar el mismo
resultado.

Leyendo un poco el código de BeautifulSoup[1] (bzr co lp:beautifulsoup)
veo que el methodo __contains__[2] esta implementado, pero lo que en
realidad verifica es otra cosa.

Vean

>>> data = '<div id="test">bla</div>'
>>> soup = BeautifulSoup(data)
>>> x = soup.find('div')
>>> x.__class__
<class BeautifulSoup.Tag at 0x10dec2d0>
>>> x.has_key('id')
True
>>> 'id' in x
False
>>> 'bla' in x
True
>>>

Soy solo yo o creo es poco pythonico? y que cuando has_key quede fuera
de uso, usar has_key en BeautifulSoup va a ser creepy? Debería reportar
un bug verdad? 

[0] http://docs.python.org/library/stdtypes.html#dict.has_key
[1] https://code.launchpad.net/beautifulsoup
[2]
http://docs.python.org/reference/expressions.html#membership-test-details


Saludos.

nueces...




More information about the pyar mailing list