Обнаружить объект re (regexp) в Python
Интересно, что такое правильный пифонический метод обратной и прямой совместимости, как проверить, скомпилирован ли объект re
.
isinstance
метод не может быть легко использован, в то время как результирующий объект утверждает, что он _sre.SRE_Pattern
object:
>>> import re
>>> rex = re.compile('')
>>> rex
<_sre.SRE_Pattern object at 0x7f63db414390>
но такого не существует:
>>> 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'
Я не хочу использовать утиную печать (т.е. проверять наличие определенных методов), потому что это может столкнуться с некоторыми другими типами.
В настоящее время я использую:
>>> RegexpType = type(re.compile(''))
>>> type(rex) == RegexpType
True
но может быть лучший способ.
Ответы
Ответ 1
re._pattern_type
существует и, как представляется, делает то, что вы хотите:
>>> isinstance(re.compile(''), re._pattern_type)
True
Но это не очень хорошая идея: в соответствии с соглашением на Python имена, начинающиеся с _, не являются частью публичного API модуля, а не являются частью гарантий обратной совместимости. Таким образом, использование type(re.compile(''))
- ваш лучший выбор - хотя обратите внимание, что это тоже не гарантируется, так как модуль re не упоминает об объекте, возвращенном из re.compile(), какого-либо конкретного класса.
И действительно, даже если бы это было гарантировано, большинство Pythonic и обратно-совместимых способов было бы полагаться на интерфейс, а не на тип. Другими словами, обнимая утиную печать и EAFP, сделайте что-то вроде этого:
try:
rex.match(my_string)
except AttributeError:
# rex is not an re
else:
# rex is an re
Ответ 2
В подобном вопросе ответа не было, кроме решения, которое вы используете, поэтому я думаю, что лучшего способа нет.
Ответ 3
import re
print isinstance(<yourvar>, re.RE_Pattern)
Ответ 4
Следуя некоторым рекомендациям, вы можете придумать:
import re
# global constant
RE_TYPE = re.compile('').__class__
def is_regex(a):
return isinstance(a, RE_TYPE)