Me pregunto cuál es el método pitón compatible hacia atrás y hacia adelante adecuado para verificar si un objeto está compilado re objeto.

El método isinstance no se puede usar fácilmente, mientras que el objeto resultante afirma ser _sre.SRE_Pattern objeto:

>>> import re
>>> rex = re.compile('')
>>> rex
<_sre.SRE_Pattern object at 0x7f63db414390>

Pero no hay tal:

>>> import _sre
>>> _sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> import sre
__main__:1: DeprecationWarning: The sre module is deprecated, please import re.
>>> sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> re.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

No quiero usar la escritura de pato (es decir, verificar la disponibilidad de algunos métodos específicos), porque esto podría colisionar con algunos otros tipos.

Por ahora, estoy usando:

>>> RegexpType = type(re.compile(''))
>>> type(rex) == RegexpType
True

Pero podría haber una mejor manera ...

20
mykhal 3 jun. 2011 a las 14:55

4 respuestas

La mejor respuesta

re._pattern_type existe y parece hacer lo que quieres:

>>> isinstance(re.compile(''), re._pattern_type)
True

Pero esta no es una buena idea: según la convención de Python, los nombres que comienzan con _ no son parte de la API pública de un módulo ni de las garantías de compatibilidad con versiones anteriores. Por lo tanto, utilizar type(re.compile('')) es su mejor opción, aunque tenga en cuenta que tampoco se garantiza que esto funcione, ya que el módulo re no menciona que el objeto devuelto por re.compile () sea de una clase en particular.

Y, de hecho, incluso si esto estuviera garantizado, la forma más compatible con Pythonic y hacia atrás y hacia adelante sería confiar en la interfaz , en lugar del tipo. En otras palabras, abrazando la escritura de pato y EAFP, haga algo como esto:

try:
     rex.match(my_string)
except AttributeError:
     # rex is not an re
else:
     # rex is an re
26
lvc 3 jun. 2011 a las 12:48
import re

print isinstance(<yourvar>, re.RE_Pattern)
1
Artsiom Rudzenka 3 jun. 2011 a las 11:55

Siguiendo algunas de las recomendaciones que puede formular:

import re

# global constant
RE_TYPE = re.compile('').__class__

def is_regex(a):
    return isinstance(a, RE_TYPE)
3
Totoro 16 feb. 2017 a las 15:22

En pregunta similar no había otra respuesta que la solución que usa , así que creo que no hay mejor manera.

1
Community 23 may. 2017 a las 12:34