[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