[Python-bugs-list] [ python-Bugs-407379 ] SRE objects of no known type

nobody nobody@sourceforge.net
Mon, 12 Mar 2001 11:25:59 -0800


Bugs #407379, was updated on 2001-03-09 11:43
You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=407379&group_id=5470

Category: Extension Modules
Group: Not a Bug
Status: Closed
Priority: 5
Submitted By: Joshua Macy
Assigned to: Fred L. Drake, Jr.
Summary: SRE objects of no known type

Initial Comment:
The new SRE re module doesn't seem to create pattern 
types of any type known to types.

Python 2.1b1 (#11, Mar  2 2001, 11:23:29) [MSC 32 bit 
(Intel)] on win32
Type "copyright", "credits" or "license" for more 
information.
>>> import re
>>> r = re.compile('abc')
>>> type(r)
<type 'SRE_Pattern'>
>>> import types
>>> isinstance(r, types.InstanceType)
0

Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit 
(Intel)] on win3
Copyright 1991-1995 Stichting Mathematisch Centrum, 
Amsterdam
>>> import re
>>> r = re.compile('abc')
>>> type(r)
<type 'instance'>
>>> import types
>>> isinstance(r, types.InstanceType)
1



----------------------------------------------------------------------

Comment By: Joshua Macy
Date: 2001-03-12 11:25

Message:
Logged In: YES 
user_id=7894

  As it happens, I don't care whether it's really a 
pattern, or whether it supports match or search.  This is 
for an enhancement to David Mertz' xml_pickle module, so 
what we really care about is the type, not the interface 
behavior, so that we can know how to (or whether we can) 
reinstatiate the right type of object upon unpickling...

  Thanks for the suggestion, though.



----------------------------------------------------------------------

Comment By: Fred L. Drake, Jr.
Date: 2001-03-09 21:11

Message:
Logged In: YES 
user_id=3066

This same test could be written:

pat = re.compile(...)
if type(pat) is types.InstanceType:
    pattern_type = pat.__class__
else:
    pattern_type = type(pat)

...

if isinstance(maybe_a_pattern, pattern_type):
    # looks like a pattern...
else:
    # not a pattern...

But this is a pretty fragile idiom.  Why not just assume it's a pattern, or test for the "search" or "match" attribute?  There's no reason to have suspected that the original code would work to begin with; we deal with interfaces, which are not bound to specific types of classes.

----------------------------------------------------------------------

Comment By: Joshua Macy
Date: 2001-03-09 19:38

Message:
Logged In: YES 
user_id=7894

Well, I guess I thought it was a bug because code that used
to work, along the lines of:

if type(obj) == types.InstanceType:

now fails to catch re pattern objects where it caught them
before. Moreover, it turns out to be rather difficult to get
that behavior back; the best I've been able to come up with
so far is:

if str(type(obj)) == "<type 'SRE_Pattern'>":

or creating an re object just so that I can do:

if type(obj) == type(myreobj):

but I'm not sure how robust the first is, while the second
just seems ugly.
If the type of an re or other library object is an
accidental implementation detail subject to change between
releases, so be it; I'll just have to test harder between
releases and maintain more version-specific code.


----------------------------------------------------------------------

Comment By: Fred L. Drake, Jr.
Date: 2001-03-09 17:55

Message:
Logged In: YES 
user_id=3066

SRE creates pattern objects that are of an extension type rather than an instance, so there is no entry for them in the types module.

Why do you think this is a bug?  The specific type of these objects should be irrelevant.  I'm classifying this as "Not a bug".

----------------------------------------------------------------------

You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=407379&group_id=5470