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: IDLE: Calltip fails if __getattr__ raises exception
Type: behavior Stage: resolved
Components: IDLE Versions: Python 3.3, Python 3.4, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: 20122 Superseder:
Assigned To: terry.reedy Nosy List: python-dev, roger.serwy, serhiy.storchaka, terry.reedy
Priority: normal Keywords: easy, needs review, patch

Created on 2012年12月07日 01:46 by roger.serwy, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
calltips_getattr_error.patch roger.serwy, 2012年12月07日 01:46 review
Messages (5)
msg177064 - (view) Author: Roger Serwy (roger.serwy) * (Python committer) Date: 2012年12月07日 01:46
The calltip fails if __getattr__ raises an exception. Take as an example:
Python 3.4.0a0 (default:0238cc842805+, Dec 6 2012, 19:17:04) 
[GCC 4.7.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> class Test:
	def __getattr__(self, name):
		raise Exception()
	
>>> a = Test()
>>> a(
This traceback is sent to stderr:
Exception in Tkinter callback
Traceback (most recent call last):
 File "/home/serwy/Code/python/cpython/Lib/tkinter/__init__.py", line 1442, in __call__
 return self.func(*args)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/MultiCall.py", line 166, in handler
 r = l[i](event)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/CallTips.py", line 56, in try_open_calltip_event
 self.open_calltip(False)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/CallTips.py", line 75, in open_calltip
 argspec = self.fetch_tip(expression)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/CallTips.py", line 101, in fetch_tip
 (expression,), {})
 File "/home/serwy/Code/python/cpython/Lib/idlelib/rpc.py", line 216, in remotecall
 return self.asyncreturn(seq)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/rpc.py", line 247, in asyncreturn
 return self.decoderesponse(response)
 File "/home/serwy/Code/python/cpython/Lib/idlelib/rpc.py", line 267, in decoderesponse
 raise what
Exception
The attached patch fixes the issue.
msg177076 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2012年12月07日 10:02
1. rpcclt.remotecall also can raise an exception.
2. I think fetch_tip() should return '' in case of exception as for non-existent arguments or for non-callables. You can add tests for this cases too.
3. "break" is a reserved word. It's not a good name for an attribute.
4. It will be better test for exception an instance of the special class and not break TC.
class Broken:
 def __getattr__(self, name):
 raise Exception('Broken __getattr__')
brocken = Broken()
test('brocken', '')
msg207820 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2014年01月10日 02:08
Get_entity already has try-except to block exceptions propagating from eval failure, so wrapping it is redundant. We only need worry about get_argspec.
I presume the failure is in get_argspec in the remote process:
 if hasattr(ob, '__call__'):
This can be replaced by callable(ob) as it converts exceptions to False. The appropriate return for non-callables is the current default, '', which results in no tip.
There are, however, other attribute accesses that could fail. I am reluctant to wrap get_argspec in its entirety, as that would mask bugs in Idle code as well as in user snippets. So I think each access should be protected. Since users will expect a tip for something that is a callable, I think a message might be appropriate. I checked that getattr(ob, name, default) does not convert exception to default.
Their are rpc calls in several places in Idle code. Unless failure can be triggered here in particular by user error, I do not think we should add specific protection here.
msg208701 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2014年01月21日 20:37
New changeset d55d1cbf5f9a by Terry Jan Reedy in branch '2.7':
Issue #16630: Make Idle calltips work even when __getattr__ raises.
http://hg.python.org/cpython/rev/d55d1cbf5f9a
New changeset 2fe0b2dcc98c by Terry Jan Reedy in branch '3.3':
Issue #16630: Make Idle calltips work even when __getattr__ raises.
http://hg.python.org/cpython/rev/2fe0b2dcc98c 
msg208703 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2014年01月21日 20:48
I added test_attribute_exception with two subtests for each of two nasty classes. The resulting failures were fixed in CallTips.py by replacing all ob.__call__ references with one reference inside try_except that saved the method for possible later use.
History
Date User Action Args
2022年04月11日 14:57:39adminsetgithub: 60834
2014年01月21日 20:48:10terry.reedysetstatus: open -> closed
messages: + msg208703

assignee: serhiy.storchaka -> terry.reedy
resolution: fixed
stage: needs patch -> resolved
2014年01月21日 20:37:36python-devsetnosy: + python-dev
messages: + msg208701
2014年01月10日 02:08:08terry.reedysetmessages: + msg207820
2014年01月04日 16:26:15serhiy.storchakasetdependencies: + Move CallTips tests to idle_tests
versions: + Python 2.7, - Python 3.2
2013年01月02日 13:23:51serhiy.storchakasetstage: patch review -> needs patch
2012年12月29日 22:03:18serhiy.storchakasetassignee: serhiy.storchaka
2012年12月07日 10:02:51serhiy.storchakasetnosy: + serhiy.storchaka
messages: + msg177076
2012年12月07日 01:46:15roger.serwycreate

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