diff -r d6aa3fa646e2 Lib/inspect.py --- a/Lib/inspect.py Fri Feb 21 18:30:53 2014 -0500 +++ b/Lib/inspect.py Fri Feb 21 22:19:45 2014 -0500 @@ -32,6 +32,7 @@ 'Yury Selivanov ') import ast +import enum import importlib.machinery import itertools import linecache @@ -2027,24 +2028,22 @@ pass -class _ParameterKind(int): - def __new__(self, *args, name): - obj = int.__new__(self, *args) - obj._name = name - return obj +class _ParameterKind(enum.IntEnum): + POSITIONAL_ONLY = 0 + POSITIONAL_OR_KEYWORD = 1 + VAR_POSITIONAL = 2 + KEYWORD_ONLY = 3 + VAR_KEYWORD = 4 def __str__(self): - return self._name - - def __repr__(self): - return '<_ParameterKind: {!r}>'.format(self._name) - - -_POSITIONAL_ONLY = _ParameterKind(0, name='POSITIONAL_ONLY') -_POSITIONAL_OR_KEYWORD = _ParameterKind(1, name='POSITIONAL_OR_KEYWORD') -_VAR_POSITIONAL = _ParameterKind(2, name='VAR_POSITIONAL') -_KEYWORD_ONLY = _ParameterKind(3, name='KEYWORD_ONLY') -_VAR_KEYWORD = _ParameterKind(4, name='VAR_KEYWORD') + return self._name_ + + +_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY +_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD +_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL +_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY +_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD class Parameter: @@ -2107,6 +2106,18 @@ self._partial_kwarg = _partial_kwarg + def __reduce__(self): + return (type(self), + (self._name, self._kind), + {'_partial_kwarg': self._partial_kwarg, + '_default': self._default, + '_annotation': self._annotation}) + + def __setstate__(self, state): + self._partial_kwarg = state['_partial_kwarg'] + self._default = state['_default'] + self._annotation = state['_annotation'] + @property def name(self): return self._name @@ -2659,6 +2670,14 @@ ''' return args[0]._bind(args[1:], kwargs, partial=True) + def __reduce__(self): + return (type(self), + (tuple(self._parameters.values()),), + {'_return_annotation': self._return_annotation}) + + def __setstate__(self, state): + self._return_annotation = state['_return_annotation'] + def __str__(self): result = [] render_pos_only_separator = False diff -r d6aa3fa646e2 Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Fri Feb 21 18:30:53 2014 -0500 +++ b/Lib/test/test_inspect.py Fri Feb 21 22:19:45 2014 -0500 @@ -8,6 +8,7 @@ import os from os.path import normcase import _pickle +import pickle import re import shutil import sys @@ -1654,6 +1655,12 @@ with self.assertRaisesRegex(ValueError, 'follows default argument'): S((pkd, pk)) + def test_signature_object_pickle(self): + def foo(a, *, b:1={}, **kw) -> {42:'ham'}: pass + sig = inspect.signature(foo) + sig_pickled = pickle.loads(pickle.dumps(sig)) + self.assertEqual(sig, sig_pickled) + def test_signature_immutability(self): def test(a): pass