[pypy-commit] pypy stdlib-2.7.12: tigthen partial.__setstate__
pjenvey
pypy.commits at gmail.com
Sun Oct 2 19:12:33 EDT 2016
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: stdlib-2.7.12
Changeset: r87531:a4a7312e476a
Date: 2016-10-02 16:10 -0700
http://bitbucket.org/pypy/pypy/changeset/a4a7312e476a/
Log: tigthen partial.__setstate__
diff --git a/lib_pypy/_functools.py b/lib_pypy/_functools.py
--- a/lib_pypy/_functools.py
+++ b/lib_pypy/_functools.py
@@ -8,6 +8,9 @@
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.
"""
+
+ __slots__ = ('_func', '_args', '_keywords', '__dict__')
+
def __init__(*args, **keywords):
if len(args) < 2:
raise TypeError('__init__() takes at least 2 arguments (%d given)'
@@ -50,9 +53,25 @@
(self._func, self._args, self._keywords, d))
def __setstate__(self, state):
+ if not isinstance(state, tuple) or len(state) != 4:
+ raise TypeError("invalid partial state")
+
func, args, keywords, d = state
- if d is not None:
+
+ if (not callable(func) or not isinstance(args, tuple) or
+ (keywords != None and not isinstance(keywords, dict))):
+ raise TypeError("invalid partial state")
+
+ self._func = func
+ self._args = tuple(args)
+
+ if keywords is None:
+ keywords = {}
+ elif type(keywords) is not dict:
+ keywords = dict(keywords)
+ self._keywords = keywords
+
+ if d is None:
+ self.__dict__.clear()
+ else:
self.__dict__.update(d)
- self._func = func
- self._args = args
- self._keywords = keywords
More information about the pypy-commit
mailing list