[Python-checkins] r53880 - sandbox/trunk/pep362/pep362.py sandbox/trunk/pep362/test_pep362.py

brett.cannon python-checkins at python.org
Sat Feb 24 00:19:05 CET 2007


Author: brett.cannon
Date: Sat Feb 24 00:19:04 2007
New Revision: 53880

Modified:
   sandbox/trunk/pep362/pep362.py
   sandbox/trunk/pep362/test_pep362.py
Log:
Add support for annotations.


Modified: sandbox/trunk/pep362/pep362.py
==============================================================================
--- sandbox/trunk/pep362/pep362.py	(original)
+++ sandbox/trunk/pep362/pep362.py	Sat Feb 24 00:19:04 2007
@@ -97,14 +97,22 @@
                             if argspec[3] else arg_count)
         parameters = []
         for index, arg_name in enumerate(argspec[0]):
+            kwargs = dict.fromkeys(('has_default', 'default_value',
+            'has_annotation', 'annotation'), False)
             if isinstance(arg_name, list):
                 arg_name = self.__list2tuple(arg_name)
 
+            # Default values.
             if index >= defaults_start:
-                parameters.append(Parameter(arg_name, index, True,
-                                            argspec[3][index - defaults_start]))
-            else:
-                parameters.append(Parameter(arg_name, index, False))
+                kwargs['has_default'] = True
+                kwargs['default_value'] = argspec[3][index - defaults_start]
+            # Parameter annotations.
+            if hasattr(func, 'func_annotations'):
+                if arg_name in func.func_annotations:
+                    kwargs['has_annotation'] = True
+                    kwargs['annotation'] = func.func_annotations[arg_name]
+            param = Parameter(arg_name, index, **kwargs)
+            parameters.append(param)
 
         # Keyword-only arguments.
         if hasattr(func_code, 'co_kwonlyargcount'):
@@ -113,18 +121,28 @@
             keyword_only_params = func_code.co_varnames[non_keyword_count:
                                             (non_keyword_count+keyword_count)]
             for index, param_name in enumerate(keyword_only_params):
-                has_default = False
-                default_value = None
+                kwargs = dict.fromkeys(('has_default', 'default_value',
+                'has_annotation', 'annotation'), False)
+                # Default values.
                 if func.func_kwdefaults and param_name in func.func_kwdefaults:
-                    has_default = True
-                    default_value = func.func_kwdefaults[param_name]
+                    kwargs['has_default'] = True
+                    kwargs['default_value'] = func.func_kwdefaults[param_name]
+                if param_name in func.func_annotations:
+                    kwargs['has_annotation'] = True
+                    kwargs['annotation'] = func.func_annotations[param_name]
                 parameters.append(Parameter(param_name,
                                             index+non_keyword_count,
-                                            has_default, default_value,
-                                            keyword_only=True))
+                                            keyword_only=True, **kwargs))
 
         self.parameters = tuple(parameters)
 
+        # Return annotation.
+        self.has_annotation = False
+        if hasattr(func, 'func_annotations'):
+            if 'return' in func.func_annotations:
+                self.has_annotation = True
+                self.annotation = func.func_annotations['return']
+
     @classmethod
     def __list2tuple(cls, list_):
         if not isinstance(list_, list):

Modified: sandbox/trunk/pep362/test_pep362.py
==============================================================================
--- sandbox/trunk/pep362/test_pep362.py	(original)
+++ sandbox/trunk/pep362/test_pep362.py	Sat Feb 24 00:19:04 2007
@@ -157,6 +157,41 @@
         self.failUnless(param.has_default)
         self.failUnlessEqual(param.default_value, 42)
 
+    @py3k_test
+    def test_annotations(self):
+        # Make sure the proper annotation is found.
+        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation)
+        param = sig.parameters[0]
+        self.failUnlessEqual(param.name, 'a')
+        self.failUnless(param.has_annotation)
+        self.failUnlessEqual(param.annotation, int)
+
+    @py3k_test
+    def test_annotations_default(self):
+        # Annotations with a default value should work.
+        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation_default)
+        param = sig.parameters[0]
+        self.failUnlessEqual(param.name, 'a')
+        self.failUnless(param.has_annotation)
+        self.failUnlessEqual(param.annotation, int)
+        self.failUnless(param.has_default)
+        self.failUnlessEqual(param.default_value, 42)
+
+    @py3k_test
+    def test_annotation_keyword_only(self):
+        # Keyword-only parameters can have an annotation.
+        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation_keyword_only)
+        param = sig.parameters[0]
+        self.failUnlessEqual(param.name, 'a')
+        self.failUnless(param.has_annotation)
+        self.failUnlessEqual(param.annotation, int)
+        self.failUnless(param.keyword_only)
+
+    @py3k_test
+    def test_return_annotation(self):
+        sig = pep362.Signature(pep362_py3k_fodder.return_annotation)
+        self.failUnless(sig.has_annotation)
+        self.failUnlessEqual(sig.annotation, int)
 
     def test_signature(self):
         def fresh_func():


More information about the Python-checkins mailing list