diff options
-rw-r--r-- | documentation/index.rst | 7 | ||||
-rw-r--r-- | six.py | 6 | ||||
-rw-r--r-- | test_six.py | 14 |
3 files changed, 27 insertions, 0 deletions
diff --git a/documentation/index.rst b/documentation/index.rst index a8632e7..d838e38 100644 --- a/documentation/index.rst +++ b/documentation/index.rst @@ -232,6 +232,13 @@ functions and methods is the stdlib :mod:`py3:inspect` module. requires the *obj*'s class to be passed. +.. function:: create_unbound_method(func, cls) + + Return an unbound method object wrapping *func*. In Python 2, this will return + a :func:`py3:types.MethodType` object. In Python 3 unbound methods do not + exist and this wrapper will return *func*. + + .. class:: Iterator A class for making portable iterators. The intention is that it be subclassed @@ -531,6 +531,9 @@ if PY3: create_bound_method = types.MethodType + def create_unbound_method(func, cls): + return func + Iterator = object else: def get_unbound_function(unbound): @@ -539,6 +542,9 @@ else: def create_bound_method(func, obj): return types.MethodType(func, obj, obj.__class__) + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + class Iterator(object): def next(self): diff --git a/test_six.py b/test_six.py index 118ccf6..060a966 100644 --- a/test_six.py +++ b/test_six.py @@ -456,6 +456,20 @@ def test_create_bound_method(): assert b() is x +def test_create_unbound_method(): + class X(object): + pass + + def f(self): + return self + u = six.create_unbound_method(f, X) + py.test.raises(TypeError, u) + if six.PY2: + assert isinstance(u, types.MethodType) + x = X() + assert f(x) is x + + if six.PY3: def test_b(): |