]> granicus.if.org Git - python/commitdiff
Issue #10193: Simplified instrospection used by turtle module
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Wed, 27 Oct 2010 13:25:45 +0000 (13:25 +0000)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Wed, 27 Oct 2010 13:25:45 +0000 (13:25 +0000)
Lib/turtle.py

index 5185f3c9018105e6b33869281b8e1ab4875a444b..4fc636c03c998a398cff1bf5474614c514f8fb8d 100644 (file)
@@ -109,6 +109,7 @@ import types
 import math
 import time
 import os
+import inspect
 
 from os.path import isfile, split, join
 from copy import deepcopy
@@ -3889,31 +3890,35 @@ except:
 
 
 def getmethparlist(ob):
-    "Get strings describing the arguments for the given object"
-    argText1 = argText2 = ""
+    """Get strings describing the arguments for the given object
+
+    Returns a pair of strings representing function parameter lists
+    including parenthesis.  The first string is suitable for use in
+    function definition and the second is suitable for use in function
+    call.  The "self" parameter is not included.
+    """
+    defText = callText = ""
     # bit of a hack for methods - turn it into a function
     # but we drop the "self" param.
     # Try and build one for Python defined functions
-    argOffset = 1
-    counter = ob.__code__.co_argcount
-    items2 = list(ob.__code__.co_varnames[argOffset:counter])
-    realArgs = ob.__code__.co_varnames[argOffset:counter]
+    args, varargs, varkw = inspect.getargs(ob.__code__)
+    items2 = args[1:]
+    realArgs = args[1:]
     defaults = ob.__defaults__ or []
-    defaults = list(map(lambda name: "=%s" % repr(name), defaults))
+    defaults = ["=%r" % (value,) for value in defaults]
     defaults = [""] * (len(realArgs)-len(defaults)) + defaults
-    items1 = list(map(lambda arg, dflt: arg+dflt, realArgs, defaults))
-    if ob.__code__.co_flags & 0x4:
-        items1.append("*"+ob.__code__.co_varnames[counter])
-        items2.append("*"+ob.__code__.co_varnames[counter])
-        counter += 1
-    if ob.__code__.co_flags & 0x8:
-        items1.append("**"+ob.__code__.co_varnames[counter])
-        items2.append("**"+ob.__code__.co_varnames[counter])
-    argText1 = ", ".join(items1)
-    argText1 = "(%s)" % argText1
-    argText2 = ", ".join(items2)
-    argText2 = "(%s)" % argText2
-    return argText1, argText2
+    items1 = [arg + dflt for arg, dflt in zip(realArgs, defaults)]
+    if varargs is not None:
+        items1.append("*" + varargs)
+        items2.append("*" + varargs)
+    if varkw is not None:
+        items1.append("**" + varkw)
+        items2.append("**" + varkw)
+    defText = ", ".join(items1)
+    defText = "(%s)" % defText
+    callText = ", ".join(items2)
+    callText = "(%s)" % callText
+    return defText, callText
 
 def _turtle_docrevise(docstr):
     """To reduce docstrings from RawTurtle class for functions