[Python-Dev] [Python-checkins] r88796 - in sandbox/trunk/pep362: pep362.py setup.py test_pep362.py tests

Eric Snow ericsnowcurrently at gmail.com
Thu Mar 24 05:38:48 CET 2011


Shouldn't the Signature class also support building from args and not just a
function object? Then I could use a Signature object when building a
function object, or vice versa.  Having the ability to validate args/kwargs
against a Signature object, sort of like provided by the bind method, will
be helpful, particularly with the decorator use case.  What does the tuple
form of Parameter.name represent?  Did you come to any conclusion on the
open issues in the PEP?

With the exec_closure stuff I have been looking pretty closely at
function-related C-API capability that might be worth exposing better in
python, and Signature objects would help facilitate in a much clearer way.
 Not only that, but even though CPython won't use Signature objects behind
the scenes, they can help to make the internal operations of Python more
clear by exposing the underlying mechanisms in pure python.  For example,
with a validate method you could express how args and kwargs are mapped onto
the different parts of the code object which correspond to the parts of the
Signature object.

I am looking forward to the inclusion of the function signature stuff in
3.3.

-eric


On Wed, Mar 23, 2011 at 3:39 PM, brett.cannon <python-checkins at python.org>wrote:

> Author: brett.cannon
> Date: Wed Mar 23 22:39:32 2011
> New Revision: 88796
>
> Log:
> Update code for future inclusion in Python 3.3 (when I get around to it).
>
> Added:
>   sandbox/trunk/pep362/test_pep362.py
>      - copied, changed from r88415,
> /sandbox/trunk/pep362/tests/test_pep362.py
> Removed:
>   sandbox/trunk/pep362/setup.py
>   sandbox/trunk/pep362/tests/
> Modified:
>   sandbox/trunk/pep362/   (props changed)
>   sandbox/trunk/pep362/pep362.py
>
> Modified: sandbox/trunk/pep362/pep362.py
>
> ==============================================================================
> --- sandbox/trunk/pep362/pep362.py      (original)
> +++ sandbox/trunk/pep362/pep362.py      Wed Mar 23 22:39:32 2011
> @@ -8,7 +8,7 @@
>     pass
>
>
> -class Parameter(object):
> +class Parameter:
>
>     """Represent a parameter in a function signature.
>
> @@ -31,8 +31,9 @@
>
>     """
>
> -    def __init__(self, name, position, has_default=False,
> default_value=None,
> -                 keyword_only=False, has_annotation=False,
> annotation=None):
> +    def __init__(self, name, position, *, has_default=False,
> +                 default=None, keyword_only=False, has_annotation=False,
> +                 annotation=None):
>         """Initialize a Parameter instance.
>
>         For has_* arguments, if they are False then the corresponding *
> @@ -42,13 +43,13 @@
>         self.name = name
>         self.position = position
>         if has_default:
> -            self.default_value = default_value
> +            self.default = default
>         self.keyword_only = keyword_only
>         if has_annotation:
>             self.annotation = annotation
>
>
> -class Signature(object):
> +class Signature:
>
>     """Object to represent the signature of a function/method.
>
> @@ -74,39 +75,19 @@
>
>     def __init__(self, func):
>         """Initialize from a function or method object."""
> -        if hasattr(func, 'im_func'):
> -            func = func.im_func
> -        try:
> -            func_code = func.__code__
> -        except AttributeError:
> -            # Compatibility for versions < 2.6.
> -            func_code = func.func_code
> -
> +        func_code = func.__code__
>         self.name = func.__name__
> -
> -        try:
> -            # Unneeded once 2.x support is removed; can easily get info
> the
> -            #  "hard" way.
> -            argspec = inspect.getfullargspec(func)[:4]
> -        except AttributeError:
> -            # Needed only for tuple parameters.
> -            argspec = inspect.getargspec(func)
> +        # XXX replace with own implementation
> +        argspec = inspect.getfullargspec(func)[:4]
>         parameters = {}
>
>         # Parameter information.
>         pos_count = func_code.co_argcount
> -        if hasattr(func_code, 'co_kwonlyargcount'):
> -            keyword_only_count = func_code.co_kwonlyargcount
> -        else:
> -            keyword_only_count = 0
> +        keyword_only_count = func_code.co_kwonlyargcount
>         positional = argspec[0]
>         keyword_only = func_code.co_varnames[pos_count:
>
> pos_count+keyword_only_count]
> -        try:
> -            fxn_defaults = func.__defaults__
> -        except AttributeError:
> -            # Deal with old names prior to 2.6.
> -            fxn_defaults = func.func_defaults
> +        fxn_defaults = func.__defaults__
>         if fxn_defaults:
>             pos_default_count = len(fxn_defaults)
>         else:
> @@ -126,7 +107,7 @@
>             has_annotation, annotation = self._find_annotation(func, name)
>             default_value = fxn_defaults[offset]
>             param = Parameter(name, offset+non_default_count,
> -                                has_default=True,
> default_value=default_value,
> +                                has_default=True, default=default_value,
>                                 has_annotation=has_annotation,
>                                 annotation=annotation)
>             parameters[name] = param
> @@ -134,16 +115,14 @@
>         for offset, name in enumerate(keyword_only):
>             has_annotation, annotation = self._find_annotation(func, name)
>             has_default, default_value = False, None
> -            # hasattr check only needed for versions < 2.6.
> -            if (hasattr(func, '__kwdefaults__') and func.__kwdefaults__
> and
> -                    name in func.__kwdefaults__):
> +            if func.__kwdefaults__ and name in func.__kwdefaults__:
>                 has_default = True
>                 default_value = func.__kwdefaults__[name]
>             param = Parameter(name, offset+pos_count, keyword_only=True,
> -                                has_default=has_default,
> -                                default_value=default_value,
> -                                has_annotation=has_annotation,
> -                                annotation=annotation)
> +                              has_default=has_default,
> +                              default=default_value,
> +                              has_annotation=has_annotation,
> +                              annotation=annotation)
>             parameters[name] = param
>         # Variable parameters.
>         index = pos_count + keyword_only_count
> @@ -172,9 +151,8 @@
>         self._parameters = parameters
>
>         # Return annotation.
> -        if hasattr(func, '__annotations__'):
> -            if 'return' in func.__annotations__:
> -                self.return_annotation = func.__annotations__['return']
> +        if 'return' in func.__annotations__:
> +            self.return_annotation = func.__annotations__['return']
>
>     def __getitem__(self, key):
>         return self._parameters[key]
> @@ -186,10 +164,9 @@
>         """Return True if an annotation exists for the named parameter
> along
>         with its annotation, else return False and None."""
>         has_annotation, annotation = False, None
> -        if hasattr(func, '__annotations__'):
> -            if name in func.__annotations__:
> -                has_annotation = True
> -                annotation = func.__annotations__[name]
> +        if name in func.__annotations__:
> +            has_annotation = True
> +            annotation = func.__annotations__[name]
>         return has_annotation, annotation
>
>     def _convert_name(self, name):
> @@ -234,7 +211,7 @@
>                     break
>                 else:
>                     raise BindError("too many positional arguments")
> -            self._tuple_bind(bindings, param.name, position_arg)
> +            bindings[param.name] = position_arg
>             args = args[1:]
>         # Keyword arguments & default values.
>         else:
> @@ -247,9 +224,8 @@
>                     except KeyError:
>                         raise BindError("%r unbound" % param_name)
>                 else:
> -                    if hasattr(positional_param, 'default_value'):
> -                        self._tuple_bind(bindings, param_name,
> -
>  positional_param.default_value)
> +                    if hasattr(positional_param, 'default'):
> +                        bindings[param_name] = positional_param.default
>                     else:
>                         raise BindError("%r parameter lacking default
> value" %
>                                         param_name)
> @@ -276,39 +252,14 @@
>         # Keyword-only default values.
>         else:
>             for name, param in keyword_only.items():
> -                if hasattr(param, 'default_value'):
> -                    bindings[name] = param.default_value
> +                if hasattr(param, 'default'):
> +                    bindings[name] = param.default
>                 else:
>                     raise BindError("%s parameter lacking a default value"
> %
>                                     name)
>
>         return bindings
>
> -    def _tuple_bind(self, bindings, possible_tuple, value):
> -        """Where a tuple could be a parameter, handle binding the values
> to the
> -        tuple and storing into the bindings mapping."""
> -        if not isinstance(possible_tuple, tuple):
> -            bindings[possible_tuple] = value
> -        else:
> -            # Need to make sure that value is as long as the parameter,
> but not
> -            # vice-versa.
> -            error_msg = "not enough values to unpack for %r"
> -            tuple_iter = iter(possible_tuple)
> -            try:
> -                value_iter = iter(value)
> -            except TypeError:
> -                raise BindError(error_msg % possible_tuple)
> -            while True:
> -                try:
> -                    sub_param = tuple_iter.next()
> -                except StopIteration:
> -                    break
> -                try:
> -                    sub_value = value_iter.next()
> -                except StopIteration:
> -                    raise BindError(error_msg % possible_tuple)
> -                self._tuple_bind(bindings, sub_param, sub_value)
> -
>
>  def signature(func):
>     """Return a Signature object for the function or method.
> @@ -318,15 +269,9 @@
>     attribute if possible (but is not required).
>
>     """
> -    if hasattr(func, 'im_func'):
> -        func = func.im_func
> -    sig = Signature(func)
> -    if not hasattr(func, '__signature__'):
> -        try:
> -            func.__signature__ = sig
> -        except AttributeError:
> -            pass
> -    else:
> -        sig = func.__signature__
> -
> -    return sig
> +    try:
> +        return func.__signature__
> +    except AttributeError:
> +        sig = Signature(func)
> +        func.__signature__ = sig
> +        return sig
>
> Deleted: sandbox/trunk/pep362/setup.py
>
> ==============================================================================
> --- sandbox/trunk/pep362/setup.py       Wed Mar 23 22:39:32 2011
> +++ (empty file)
> @@ -1,25 +0,0 @@
> -from distutils.core import setup
> -
> -setup(
> -        # Package metadata.
> -        name='pep362',
> -        version='0.6.2',
> -        description='Implementation of PEP 362 (Function Signature
> objects)',
> -        author='Brett Cannon',
> -        author_email='brett at python.org',
> -        url='http://svn.python.org/view/sandbox/trunk/pep362/',
> -        # Files.
> -        py_modules=['pep362', 'examples'],
> -        packages=['tests'],
> -        data_files=['README'],
> -        classifiers=[
> -            'Programming Language :: Python :: 2',
> -            'Programming Language :: Python :: 2.5',
> -            'Programming Language :: Python :: 2.6',
> -            'Programming Language :: Python :: 2.7',
> -            'Programming Language :: Python :: 3',
> -            'Programming Language :: Python :: 3.0',
> -            'Programming Language :: Python :: 3.1',
> -            'Programming Language :: Python :: 3.2',
> -        ]
> -    )
>
> Copied: sandbox/trunk/pep362/test_pep362.py (from r88415,
> /sandbox/trunk/pep362/tests/test_pep362.py)
>
> ==============================================================================
> --- /sandbox/trunk/pep362/tests/test_pep362.py  (original)
> +++ sandbox/trunk/pep362/test_pep362.py Wed Mar 23 22:39:32 2011
> @@ -1,23 +1,49 @@
>  import pep362
>
>  import unittest
> -from tests import pep362_fodder
> -try:
> -    from tests import pep362_py2_fodder
> -    from test import test_support
> -except SyntaxError:
> -    from tests import pep362_py3k_fodder
> -    from test import support as test_support
> +from test import support as test_support
>  from sys import version_info
>
>
> -def version_specific(major_number):
> -    def inner(fxn):
> -        if version_info[0] == major_number:
> -            return fxn
> -        else:
> -            return lambda self: self
> -    return inner
> +def no_args():
> +    pass
> +
> +def var_args(*args):
> +    pass
> +
> +def var_kw_args(**kwargs):
> +    pass
> +
> +def no_default_args(a):
> +    pass
> +
> +def default_args(a=42):
> +    pass
> +
> +def keyword_only(*, a):
> +    pass
> +
> +def keyword_only_default(*, a=42):
> +    pass
> +
> +def arg_annotation(a:int):
> +    pass
> +
> +def arg_annotation_default(a:int=42):
> +    pass
> +
> +def arg_annotation_var(*args:int, **kwargs:str):
> +    pass
> +
> +def arg_annotation_keyword_only(*, a:int):
> +    pass
> +
> +def return_annotation() -> int:
> +    pass
> +
> +def all_args(a:int, d=0, *args:int,
> +                g:int, h:int=8, **kwargs:int) -> int:
> +    return a, d, g, h, args, kwargs
>
>
>  class ParameterObjectTests(unittest.TestCase):
> @@ -41,13 +67,14 @@
>         self.assertEqual(param.position, pos)
>
>     def test_default_values(self):
> -        # Testing that 'default_value' is not set is handled in the
> testing of
> +        # Testing that 'default' is not set is handled in the testing of
>         # that attribute.
>         default_value = 42
> -        param = pep362.Parameter('_', 0, True, default_value)
> -        self.assertEqual(param.default_value, default_value)
> -        param = pep362.Parameter('_', 0, False)
> -        self.assertTrue(not hasattr(param, 'default_value'))
> +        param = pep362.Parameter('_', 0, has_default=True,
> +                                 default=default_value)
> +        self.assertEqual(param.default, default_value)
> +        param = pep362.Parameter('_', 0, has_default=False)
> +        self.assertTrue(not hasattr(param, 'default'))
>
>     def test_keyword_only(self):
>         # Setting the value for keyword_only should create an attribute.
> @@ -70,21 +97,21 @@
>     def test_getitem(self):
>         # __getitem__() should return the Parameter object for the name
>         # parameter.
> -        sig = pep362.Signature(pep362_fodder.default_args)
> +        sig = pep362.Signature(default_args)
>         self.assertTrue(sig['a'])
>         param = sig['a']
>         self.assertTrue(param.name, 'a')
>
>     def test_iter(self):
>         # The iterator should return all Parameter objects in the proper
> order.
> -        sig = pep362.Signature(pep362_fodder.default_args)
> +        sig = pep362.Signature(default_args)
>         params = list(sig)
>         self.assertEqual(len(params), 1)
>         self.assertEqual(params[0].name, 'a')
>
>     def test_no_args(self):
>         # Test a function with no arguments.
> -        sig = pep362.Signature(pep362_fodder.no_args)
> +        sig = pep362.Signature(no_args)
>         self.assertEqual('no_args', sig.name)
>         self.assertTrue(not sig.var_args)
>         self.assertTrue(not sig.var_kw_args)
> @@ -92,115 +119,87 @@
>
>     def test_var_args(self):
>         # Test the var_args attribute.
> -        sig = pep362.Signature(pep362_fodder.var_args)
> +        sig = pep362.Signature(var_args)
>         self.assertEqual('args', sig.var_args)
>         self.assertEqual(0, len(list(sig)))
> -        sig = pep362.Signature(pep362_fodder.no_args)
> +        sig = pep362.Signature(no_args)
>         self.assertEqual('', sig.var_args)
>
>     def test_var_kw_args(self):
>         # Test the var_kw_args attribute and annotations.
> -        sig = pep362.Signature(pep362_fodder.var_kw_args)
> +        sig = pep362.Signature(var_kw_args)
>         self.assertEqual('var_kw_args', sig.name)
>         self.assertEqual('kwargs', sig.var_kw_args)
>         self.assertEqual(0, len(list(sig)))
> -        sig = pep362.Signature(pep362_fodder.no_args)
> +        sig = pep362.Signature(no_args)
>         self.assertEqual('', sig.var_kw_args)
>
>     def test_parameter_positional(self):
>         # A function with positional arguments should work.
> -        sig = pep362.Signature(pep362_fodder.no_default_args)
> +        sig = pep362.Signature(no_default_args)
>         self.assertEqual('no_default_args', sig.name)
>         param = sig['a']
>         self.assertEqual('a', param.name)
>         self.assertEqual(0, param.position)
> -        self.assertTrue(not hasattr(param, 'default_value'))
> +        self.assertTrue(not hasattr(param, 'default'))
>
>     def test_parameter_default(self):
>         # Default parameters for a function should work.
> -        sig = pep362.Signature(pep362_fodder.default_args)
> +        sig = pep362.Signature(default_args)
>         self.assertEqual('default_args', sig.name)
>         param = sig['a']
>         self.assertEqual('a', param.name)
>         self.assertEqual(0, param.position)
> -        self.assertEqual(42, param.default_value)
> -
> -    @version_specific(2)
> -    def test_parameter_tuple(self):
> -        # A function with a tuple as a parameter should work.
> -        sig = pep362.Signature(pep362_py2_fodder.tuple_args)
> -        self.assertEqual('tuple_args', sig.name)
> -        param = list(sig)[0]
> -        self.assertTrue(isinstance(param.name, tuple))
> -        self.assertEqual(('a', ('b',)), param.name)
> -        self.assertEqual(0, param.position)
> -        self.assertTrue(not hasattr(param, 'default_value'))
> +        self.assertEqual(42, param.default)
>
> -    @version_specific(2)
> -    def test_parameter_tuple_default(self):
> -        # A default argument for a tuple parameter needs to work.
> -        sig = pep362.Signature(pep362_py2_fodder.default_tuple_args)
> -        self.assertEqual('default_tuple_args', sig.name)
> -        param = list(sig)[0]
> -        self.assertEqual(('a', ('b',)), param.name)
> -        self.assertEqual(0, param.position)
> -        self.assertEqual((1, (2,)), param.default_value)
> -
> -    @version_specific(3)
>     def test_keyword_only(self):
>         # Is a function containing keyword-only parameters handled
> properly?
> -        sig = pep362.Signature(pep362_py3k_fodder.keyword_only)
> +        sig = pep362.Signature(keyword_only)
>         param = sig['a']
>         self.assertEqual(param.name, 'a')
>         self.assertTrue(param.keyword_only)
>         self.assertEqual(param.position, 0)
>
> -    @version_specific(3)
>     def test_keyword_only_default(self):
>         # Default arguments can work for keyword-only parameters.
> -        sig = pep362.Signature(pep362_py3k_fodder.keyword_only_default)
> +        sig = pep362.Signature(keyword_only_default)
>         param = sig['a']
>         self.assertEqual(param.name, 'a')
>         self.assertTrue(param.keyword_only)
>         self.assertEqual(param.position, 0)
> -        self.assertEqual(param.default_value, 42)
> +        self.assertEqual(param.default, 42)
>
> -    @version_specific(3)
>     def test_annotations(self):
>         # Make sure the proper annotation is found.
> -        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation)
> +        sig = pep362.Signature(arg_annotation)
>         param = sig['a']
>         self.assertEqual(param.name, 'a')
>         self.assertEqual(param.annotation, int)
>
> -    @version_specific(3)
>     def test_annotations_default(self):
>         # Annotations with a default value should work.
> -        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation_default)
> +        sig = pep362.Signature(arg_annotation_default)
>         param = sig['a']
>         self.assertEqual(param.name, 'a')
>         self.assertEqual(param.annotation, int)
> -        self.assertEqual(param.default_value, 42)
> +        self.assertEqual(param.default, 42)
>
> -    @version_specific(3)
>     def test_annotation_keyword_only(self):
>         # Keyword-only parameters can have an annotation.
> -        sig =
> pep362.Signature(pep362_py3k_fodder.arg_annotation_keyword_only)
> +        sig = pep362.Signature(arg_annotation_keyword_only)
>         param = sig['a']
>         self.assertEqual(param.name, 'a')
>         self.assertEqual(param.annotation, int)
>         self.assertTrue(param.keyword_only)
>
> -    @version_specific(3)
>     def test_return_annotation(self):
>         # The return value annotation.
> -        sig = pep362.Signature(pep362_py3k_fodder.return_annotation)
> +        sig = pep362.Signature(return_annotation)
>         self.assertEqual(sig.return_annotation, int)
>
> -    @version_specific(3)
>     def test_var_annotations(self):
>         # Annotation on variable arguments (*args & **kwargs).
> -        sig = pep362.Signature(pep362_py3k_fodder.arg_annotation_var)
> +        sig = pep362.Signature(arg_annotation_var)
>         self.assertEqual(sig.var_annotations[sig.var_args], int)
>         self.assertEqual(sig.var_annotations[sig.var_kw_args], str)
>
> @@ -224,14 +223,14 @@
>     """Test Signature.bind()."""
>
>     def test_no_parameters(self):
> -        sig = pep362.Signature(pep362_fodder.no_args)
> +        sig = pep362.Signature(no_args)
>         binding = sig.bind()
>         self.assertEqual({}, binding)
>         self.assertRaises(pep362.BindError, sig.bind, 42)
>         self.assertRaises(pep362.BindError, sig.bind, a=0)
>
>     def test_var_parameters(self):
> -        sig = pep362.Signature(pep362_fodder.var_args)
> +        sig = pep362.Signature(var_args)
>         binding = sig.bind(0, 1, 2)
>         self.assertEqual({'args':(0, 1, 2)}, binding)
>         binding = sig.bind()
> @@ -239,7 +238,7 @@
>         self.assertRaises(pep362.BindError, sig.bind, a=0)
>
>     def test_var_kw_parameters(self):
> -        sig = pep362.Signature(pep362_fodder.var_kw_args)
> +        sig = pep362.Signature(var_kw_args)
>         binding = sig.bind(a=0)
>         self.assertEqual({'kwargs':{'a':0}}, binding)
>         binding = sig.bind()
> @@ -247,7 +246,7 @@
>         self.assertRaises(pep362.BindError, sig.bind, 42)
>
>     def test_positional_parameters(self):
> -        sig = pep362.Signature(pep362_fodder.no_default_args)
> +        sig = pep362.Signature(no_default_args)
>         binding = sig.bind(42)
>         self.assertEqual({'a':42}, binding)
>         binding = sig.bind(a=42)
> @@ -257,7 +256,7 @@
>         self.assertRaises(pep362.BindError, sig.bind, b=0)
>
>     def test_keyword_parameters(self):
> -        sig = pep362.Signature(pep362_fodder.default_args)
> +        sig = pep362.Signature(default_args)
>         binding = sig.bind()
>         self.assertEqual({'a':42}, binding)
>         binding = sig.bind(0)
> @@ -268,73 +267,24 @@
>         self.assertRaises(pep362.BindError, sig.bind, a=0, b=1)
>         self.assertRaises(pep362.BindError, sig.bind, b=1)
>
> -    @version_specific(2)
> -    def test_tuple_parameter(self):
> -        sig = pep362.Signature(pep362_py2_fodder.tuple_args)
> -        arg = (1, ((2,),))
> -        binding = sig.bind(arg)
> -        self.assertEqual({'a':1, 'b':(2,)}, binding)
> -        self.assertRaises(pep362.BindError, sig.bind, (1,2,3))
> -        self.assertRaises(pep362.BindError, sig.bind, (1, 2))
> -
> -    @version_specific(2)
> -    def test_default_tuple_parameter(self):
> -        sig = pep362.Signature(pep362_py2_fodder.default_tuple_args)
> -        binding = sig.bind()
> -        self.assertEqual({'a':1, 'b':2}, binding)
> -        arg = (0, (1,))
> -        binding = sig.bind(arg)
> -        self.assertEqual({'a':0, 'b':1}, binding)
> -
> -    @version_specific(2)
> -    def test_py2_all_args(self):
> -        sig = pep362.Signature(pep362_py2_fodder.all_args)
> -        # a, (b, (c,)), d=0, (e, (f,))=(4, (5,)), *g, **h
> -        # name, position, has_default, default value
> -        expect = (('a', 0, False, None),
> -                    (('b', ('c',)), 1, False, None),
> -                    ('d', 2, True, 0),
> -                    (('e', ('f',)), 3, True, (4, (5,))))
> -        self.assertEqual(len(list(sig)), len(expect))
> -        for param, check in zip(list(sig), expect):
> -            name, pos, has_default, default_value = check
> -            self.assertEqual(param.name, name)
> -            self.assertEqual(param.position, pos)
> -            if has_default:
> -                self.assertEqual(param.default_value, default_value)
> -            else:
> -                self.assertTrue(not hasattr(param, 'default_value'))
> -            self.assertTrue(not param.keyword_only)
> -            self.assertTrue(not hasattr(param, 'annotation'))
> -        self.assertEqual(sig.var_args, 'g')
> -        self.assertEqual(sig.var_kw_args, 'h')
> -        self.assertEqual(len(sig.var_annotations), 0)
> -        binding = sig.bind(0, (1, (2,)), d=3, i=7)
> -        expected = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5, 'g':tuple(),
> -                    'h':{'i':7}}
> -        self.assertEqual(expected, binding)
> -
> -    @version_specific(3)
>     def test_keyword_only(self):
> -        sig = pep362.Signature(pep362_py3k_fodder.keyword_only)
> +        sig = pep362.Signature(keyword_only)
>         binding = sig.bind(a=42)
>         self.assertEqual(binding, {'a':42})
>         self.assertRaises(pep362.BindError, sig.bind)
>         self.assertRaises(pep362.BindError, sig.bind, 42)
>
> -    @version_specific(3)
>     def test_keyword_only_default(self):
> -        sig = pep362.Signature(pep362_py3k_fodder.keyword_only_default)
> +        sig = pep362.Signature(keyword_only_default)
>         binding = sig.bind()
>         self.assertEqual(binding, {'a':42})
>         binding = sig.bind(a=1)
>         self.assertEqual(binding, {'a':1})
>         self.assertRaises(pep362.BindError, sig.bind, 1)
>
> -    @version_specific(3)
>     def test_all_py3k_args(self):
>         # a:int, d=0, *args:int, g:int, h:int=8, **kwargs:int) -> int
> -        sig = pep362.Signature(pep362_py3k_fodder.all_args)
> +        sig = pep362.Signature(all_args)
>         # name, position, kw only, has_default, default, has anno, anno
>         expected = (('a', 0, False, False, None, True, int),
>                     ('d', 1, False, True, 0, False, None),
> @@ -353,9 +303,9 @@
>             else:
>                 self.assertTrue(not param.keyword_only)
>             if has_default:
> -                self.assertEqual(param.default_value, default)
> +                self.assertEqual(param.default, default)
>             else:
> -                self.assertTrue(not hasattr(param, 'default_value'))
> +                self.assertTrue(not hasattr(param, 'default'))
>             if has_anno:
>                 self.assertEqual(param.annotation, anno)
>             else:
> @@ -373,7 +323,7 @@
>
>     def test_too_many_arguments(self):
>         # Only one argument should pair up with a parameter.
> -        sig = pep362.Signature(pep362_fodder.no_default_args)
> +        sig = pep362.Signature(no_default_args)
>         self.assertRaises(pep362.BindError, sig.bind, 1, a=1)
>
>
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20110323/f592ec74/attachment-0001.html>


More information about the Python-Dev mailing list