Take your time, but hurry up ;) On Thu, Mar 24, 2011 at 10:57 AM, Brett Cannon <brett at python.org> wrote: > > > On Wed, Mar 23, 2011 at 21:38, Eric Snow <ericsnowcurrently at gmail.com>wrote: > >> 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. > > > I will probably try to add that functionality, but one thing at a time. =) > > > >> What does the tuple form of Parameter.name represent? > > > What tuple form? If you mean tuple parameters those no longer exist. > > >> Did you come to any conclusion on the open issues in the PEP? > > > Nope. You are getting ahead of me. =) > > -Brett > > >> >> 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 >>> >> >> >> _______________________________________________ >> Python-Dev mailing list >> Python-Dev at python.org >> http://mail.python.org/mailman/listinfo/python-dev >> Unsubscribe: >> http://mail.python.org/mailman/options/python-dev/brett%40python.org >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20110324/4db3ab25/attachment-0001.html>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4