【问题标题】:re.RegexObject doesn't exist (raises AttributeError)re.RegexObject 不存在(引发 AttributeError)
【发布时间】:2012-06-14 14:04:10
【问题描述】:

在我最近的一系列问题中,我询问了关于玩弄argparse 的内部结构的问题。大多数情况下,我想更改定义为的属性:

class FooClass(object):
   def __init__(self):
      self._this_is_a_re=re.compile("foo")

由于它是“受保护的”,我想在替换为我自己的正则表达式之前检查此属性是否存在以及它是否是正则表达式。例如:

import re
myFoo=FooClass()
attr='_this_is_a_re'
if(hasattr(myFoo,attr) and isinstance(getattr(myFoo,attr),re.RegexObject):
   setattr(myFoo,attr,re.compile("bar"))

这将失败并出现属性错误,因为 re 没有名为 RegexObject 的属性,即使它位于 documentation 中。为什么 RegexObject 记录在案但不可用?我应该在那里使用什么?我想我可以说:type(a) is type(b),但这看起来很丑……

【问题讨论】:

    标签: python regex monkeypatching


    【解决方案1】:

    它是<type '_sre.SRE_Pattern'>,但我只想使用type(re.compile(''))

    顺便说一句,似乎即使re 开发人员也不确定确切的类型是什么,如here 所示:

    _pattern_type = type(sre_compile.compile("", 0))
    

    【讨论】:

    • 是的,我可以看到...但是当re.RegexObject 是我们在文档中一直引用的内容时,为什么类型会以下划线为前缀?和isinstance(a,_sre.SRE_Pattern) 也不起作用。 isinstance(a,re._pattern_type) 确实有效。
    • 看起来我们在同一个想法上趋同——我通过反复试验和查看dir 的输出得到了它——检查源可能是更好的方法。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-12-08
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多