homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: try/except block in ismethoddescriptor() in inspect.py, so that pydoc works with pygame in Python 3.2
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.2
process
Status: closed Resolution: duplicate
Dependencies: Superseder: "inspect" gets broken by some descriptors
View: 1785
Assigned To: Nosy List: eric.araujo, illume, michael.foord, ncdave4life, pitrou, r.david.murray, yselivanov
Priority: normal Keywords: patch

Created on 2012年03月19日 04:42 by ncdave4life, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
inspect.diff ncdave4life, 2012年03月19日 04:42 inspect.py patch so that pydoc works with pygame
Messages (11)
msg156314 - (view) Author: Dave Burton (ncdave4life) Date: 2012年03月19日 04:42
I noticed that pydoc doesn't work for pygame under python 3.2.1 or 3.2.2 for Win32; it just reports:
NotImplementedError: scrap module not available (ImportError: No module
named scrap)
I made a small patch to inspect.py to solve the problem (I just added a
try/expect around the failing statement in ismethoddescriptor). Here's the diff:
http://www.burtonsys.com/python32/inspect.diff
With that patch, pydoc works with pygame, and reports just a few pygame issues:
*scrap* = <pygame.MissingModule object>
*sndarray* = <pygame.MissingModule object>
*surfarray* = <pygame.MissingModule object>
msg156381 - (view) Author: Dave Burton (ncdave4life) Date: 2012年03月20日 05:20
"expect?" Did I type that?? Should be "try/except," of course.
msg156553 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012年03月22日 12:40
Thanks for the report and patch. However, in general we prefer not to mask exceptions (doing that can hide bugs in programs). It would probably be reasonable to fix this in pydoc, however.
Alternatively there might be a specific exception or set of exceptions that should indeed result in a False value. What exception is being raised? Can you provide a test case extracted from what pygame is doing that triggers the problem?
msg156577 - (view) Author: Dave Burton (ncdave4life) Date: 2012年03月22日 15:39
Well, the exception is NotImplementedError. It's raised explicitly in pygame\__init__.py
I uncommented my commented-out print statement in inspect.py, and added a traceback print, and ran pydoc like this:
c:\python32\python.exe c:\python32\Lib\pydoc.py -p 7464
The I viewed http://localhost:7464/pygame.html in a web browser, and the pydoc server printed:
Server ready at http://localhost:7464/
Server commands: [b]rowser, [q]uit
server> c:\python32\Lib\inspect.py:105: RuntimeWarning: use scrap: No module named scrap
(ImportError: No module named scrap)
 result = (hasattr(object, "__get__")
dbg: ismethoddescriptor(<pygame.MissingModule object at 0x03763F90>) failed, exception=NotImplementedError('scrap module not available\n(ImportError: No module named scrap)',)
Traceback (most recent call last):
 File "c:\python32\Lib\inspect.py", line 105, in ismethoddescriptor
 result = (hasattr(object, "__get__")
 File "c:\python32\lib\site-packages\pygame\__init__.py", line 74, in __getattr__
 raise NotImplementedError(MissingPygameModule)
NotImplementedError: scrap module not available
(ImportError: No module named scrap)
------------------------------------------------------------
c:\python32\Lib\inspect.py:105: RuntimeWarning: use sndarray: no module named numpy or Numeric found
(ImportError: no module named numpy or Numeric found)
 result = (hasattr(object, "__get__")
dbg: ismethoddescriptor(<pygame.MissingModule object at 0x0376EFF0>) failed, exception=NotImplementedError('sndarray module not available\n(ImportError: no module named numpy or Numeric found)',)
Traceback (most recent call last):
...(etc.)
Here's the modified ismethoddescriptor() in inspect.py:
def ismethoddescriptor(object):
 """Return true if the object is a method descriptor.
 But not if ismethod() or isclass() or isfunction() are true.
 This is new in Python 2.2, and, for example, is true of int.__add__.
 An object passing this test has a __get__ attribute but not a __set__
 attribute, but beyond that the set of attributes varies. __name__ is
 usually sensible, and __doc__ often is.
 Methods implemented via descriptors that also pass one of the other
 tests return false from the ismethoddescriptor() test, simply because
 the other tests promise more -- you can, e.g., count on having the
 __func__ attribute (etc) when an object passes ismethod()."""
 import traceback
 try:
 result = (hasattr(object, "__get__")
 and not hasattr(object, "__set__") # else it's a data descriptor
 and not ismethod(object) # mutual exclusion
 and not isfunction(object)
 and not isclass(object))
 except Exception as whichone:
 print('dbg: ismethoddescriptor('+repr(object)+') failed, exception='+repr(whichone))
 traceback.print_exc(file=sys.stdout)
 print("-"*60 + '\n')
 result = False
 return result
msg156581 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012年03月22日 15:58
Michael, I thought you might be interested in this one since it looks like it might involve inspect executing code unexpectedly, and I know you worked on ways of not doing that...
msg156601 - (view) Author: Michael Foord (michael.foord) * (Python committer) Date: 2012年03月22日 18:32
The code is *already* triggering execution through the use of hasattr. It could be switched to use getattr_static instead, but the try...except in the patch looks reasonable whether or not that change is made.
msg156602 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012年03月22日 18:39
Well, the exception shouldn't be silenced. As David said, I think it would be better to silence the exception in pydoc.
Besides, it would be nice to come with a standalone test case, because it's not clear exactly why pygame triggers this.
msg156645 - (view) Author: Michael Foord (michael.foord) * (Python committer) Date: 2012年03月23日 10:38
So PyGame __init__.py has various not-a-module objects with __getattr__ that raises a NotImplementedError on every attribute access. Changing inspect to use getattr_static, so it doesn't trigger code execution on attribute access, would fix the problem.
Making pydoc resilient against exceptions is probably a *better* solution for the specific problem - although changing ismethoddescriptor to not trigger code execution would be good *as well*.
msg212154 - (view) Author: Yury Selivanov (yselivanov) * (Python committer) Date: 2014年02月25日 01:05
Is this still an issue?
msg236494 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2015年02月24日 13:43
The code in ismethoddescriptor was completely rewritten as a result of #1785 rendering the attached patch obsolete.
msg344843 - (view) Author: Rene Dudfield (illume) Date: 2019年06月06日 17:15
This can be closed.
$ python3 -m pydoc -p 7464
Then view in browser: http://localhost:7464/pygame.html
No error.
History
Date User Action Args
2022年04月11日 14:57:28adminsetgithub: 58575
2020年11月07日 00:55:20iritkatrielsetstatus: open -> closed
superseder: "inspect" gets broken by some descriptors
resolution: duplicate
stage: test needed -> resolved
2019年06月06日 17:15:42illumesetnosy: + illume
messages: + msg344843
2019年03月15日 22:46:26BreamoreBoysetnosy: - BreamoreBoy
2015年02月24日 13:43:43BreamoreBoysetnosy: + BreamoreBoy
messages: + msg236494
2014年02月25日 01:05:17yselivanovsetnosy: + yselivanov
messages: + msg212154
2012年03月24日 15:27:11eric.araujosetnosy: + eric.araujo
2012年03月23日 10:38:25michael.foordsetmessages: + msg156645
2012年03月22日 18:39:21pitrousetnosy: + pitrou
messages: + msg156602
2012年03月22日 18:32:52michael.foordsetmessages: + msg156601
2012年03月22日 15:58:03r.david.murraysetnosy: + michael.foord
messages: + msg156581
2012年03月22日 15:39:04ncdave4lifesetmessages: + msg156577
2012年03月22日 12:40:05r.david.murraysetnosy: + r.david.murray

messages: + msg156553
stage: test needed
2012年03月20日 05:20:38ncdave4lifesetmessages: + msg156381
2012年03月19日 04:42:23ncdave4lifecreate

AltStyle によって変換されたページ (->オリジナル) /