[ python-Bugs-934282 ] pydoc.stripid doesn't strip ID

SourceForge.net noreply at sourceforge.net
Fri Jun 18 21:24:35 EDT 2004


Bugs item #934282, was opened at 2004-04-13 08:32
Message generated for change (Comment added) made by bcannon
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=934282&group_id=5470

Category: Python Library
Group: None
>Status: Closed
Resolution: None
Priority: 5
Submitted By: Jim Jewett (jimjjewett)
Assigned to: Nobody/Anonymous (nobody)
Summary: pydoc.stripid doesn't strip ID

Initial Comment:
pydoc function stripid should strip the ID from an object's 
repr.  It assumes that ID will be represented as one of 
two patterns -- but this is not the case with (at least) 
the 2.3.3 distributed binary, because of case-sensitivity.

' at 0x[0-9a-f]{6,}(>+)$' 
fails because the address is capitalized -- A-F.  (Note 
that hex(15) is not capitalized -- this seems to be unique 
to addresses.)

' at [0-9A-F]{8,}(>+)$'
fails because the address does contain a 0x.

stripid checks both as a guard against false alarms, but 
I'm not sure how to guarantee that an address would 
contain a letter, so matching on either all-upper or 
all-lower may be the tightest possible bound.



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

>Comment By: Brett Cannon (bcannon)
Date: 2004-06-18 18:24

Message:
Logged In: YES 
user_id=357491

OK, I took Robin's idea of extracting out the regex, but just made it case-
insensitive with re.IGNORECASE.  Also ripped out dealing with the case 
lacking '0x' thanks to Tim's tip.  Finally, I changed the match length from 
6 to 6-16 to be able to handle 64-bit addresses (only in 2.4 since I could 
be wrong).

Checked in as rev. 1.93 in HEAD and rev. 1.86.8.2 in 2.3 .  Thanks, 
Robin.

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

Comment By: Tim Peters (tim_one)
Date: 2004-06-05 10:05

Message:
Logged In: YES 
user_id=31435

This can be simplifed.  The code in PyString_FromFormatV() 
massages the native %p result to guarantee it begins 
with "0x".  It didn't always do this, and inspect.py was 
written when Python didn't massage the native %p result at 
all.  Now there's no need to cater to "0X", or to cater to 
that "0x" might be missing.  The case of a-f may still differ 
across platforms, and that's deliberate (addresses are of 
most interest to C coders, and they're "used to" whichever 
case their platform delivers for %p in C code).

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

Comment By: Robin Becker (rgbecker)
Date: 2004-06-05 09:31

Message:
Logged In: YES 
user_id=6946

This is the PROPER pasted in patch

===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pydoc.py,v
retrieving revision 1.90
diff -c -r1.90 pydoc.py
*** pydoc.py    29 Jan 2004 06:37:49 -0000      1.90
--- pydoc.py    5 Jun 2004 15:33:52 -0000
***************
*** 113,124 ****
          return text[:pre] + '...' + text[len(text)-post:]
      return text

  def stripid(text):
      """Remove the hexadecimal id from a Python object
representation."""
      # The behaviour of %p is implementation-dependent; we
check two cases.
!     for pattern in [' at 0x[0-9a-f]{6,}(>+)$', ' at
[0-9A-F]{8,}(>+)$']:
!         if re.search(pattern, repr(Exception)):
!             return re.sub(pattern, '\1', text)
      return text

  def _is_some_method(object):
--- 113,124 ----
          return text[:pre] + '...' + text[len(text)-post:]
      return text

+ _re_stripid =re.compile(' at
(?:0[xX][0-9a-fA-F]{6,}|[0-9a-fA-F]{8,})(>+)$')
  def stripid(text):
      """Remove the hexadecimal id from a Python object
representation."""
      # The behaviour of %p is implementation-dependent; we
check two cases.
!     if _re_stripid.search(repr(Exception)):
!         return _re_stripid.sub('\1', text)
      return text

  def _is_some_method(object):

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

Comment By: Robin Becker (rgbecker)
Date: 2004-06-05 09:23

Message:
Logged In: YES 
user_id=6946

This patch seems to fix variable case problems
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/pydoc.py,v
retrieving revision 1.90
diff -c -r1.90 pydoc.py
*** pydoc.py    29 Jan 2004 06:37:49 -0000      1.90
--- pydoc.py    5 Jun 2004 15:26:31 -0000
***************
*** 113,124 ****
          return text[:pre] + '...' + text[len(text)-post:]
      return text

  def stripid(text):
      """Remove the hexadecimal id from a Python object
representation."""
      # The behaviour of %p is implementation-dependent; we
check two cases.
!     for pattern in [' at 0x[0-9a-f]{6,}(>+)$', ' at
[0-9A-F]{8,}(>+)$']:
!         if re.search(pattern, repr(Exception)):
!             return re.sub(pattern, '\1', text)
      return text

  def _is_some_method(object):
--- 113,124 ----
          return text[:pre] + '...' + text[len(text)-post:]
      return text

+ _re_stripid =re.compile(' at
(?:0[xX][0-9a-fA-F]{6,}|[0-9a-fA-F]{8,})(>+)$']
  def stripid(text):
      """Remove the hexadecimal id from a Python object
representation."""
      # The behaviour of %p is implementation-dependent; we
check two cases.
!     if _re_stripid.search(repr(Exception)):
!         return _re_stripid.sub('\1', text)
      return text

  def _is_some_method(object):

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

Comment By: Robin Becker (rgbecker)
Date: 2004-06-05 08:36

Message:
Logged In: YES 
user_id=6946

Definitely a problem in 2.3.3.

using
class bongo: pass
print bongo()

On freebsd with 2.3.3 I get
<__main__.bongo instance at 0x81a05ac>

with win2k I see
<__main__.bongo instance at 0x0112FFD0>

both are 8 characters, but the case differs.

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

Comment By: Thomas Heller (theller)
Date: 2004-04-14 12:34

Message:
Logged In: YES 
user_id=11105

It seems this depends on the operating system, more exactly
on how the C compiler interprets the %p printf format.
According to what I see, on windows it fails, on linux it works.

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

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



More information about the Python-bugs-list mailing list