diff --git a/tests/run/call_py_cy.pyx b/tests/run/call_py_cy.pyx index cf830527cf74b92563dab4f7a7a5c4764e3f33f8..0bacd2cf593a517f6fb979c5007ef268958788e4 100644 --- a/tests/run/call_py_cy.pyx +++ b/tests/run/call_py_cy.pyx @@ -12,6 +12,7 @@ py_call_twoargs = eval("lambda arg, arg2: (arg, arg2)") py_call_starargs = eval("lambda *args: args") py_call_pos_and_starargs = eval("lambda arg, *args: (arg, args)") py_call_starstarargs = eval("lambda **kw: sorted(kw.items())") +py_call_args_and_starstarargs = eval("lambda *args, **kw: (args, sorted(kw.items()))") def cy_call_noargs(): @@ -32,6 +33,12 @@ def cy_call_onearg(f): >>> try: cy_call_onearg(py_call_twoargs) ... except TypeError: pass ... else: print("FAILED!") + + >>> class Class(object): + ... def method(self, arg): return arg + + >>> cy_call_onearg(Class().method) + 'onearg' """ return f('onearg') @@ -40,20 +47,36 @@ def cy_call_twoargs(f, arg): """ >>> cy_call_twoargs(py_call_twoargs, 132) (132, 'twoargs') + + >>> class Class2(object): + ... def method(self, arg, arg2): return arg, arg2 + >>> cy_call_twoargs(Class2().method, 123) + (123, 'twoargs') + + >>> class Class1(object): + ... def method(self, arg): return arg + >>> cy_call_twoargs(Class1.method, Class1()) + 'twoargs' """ return f(arg, 'twoargs') def cy_call_two_kwargs(f, arg): """ - >>> cy_call_twoargs(py_call_twoargs, arg=132) - (132, 'twoargs') - >>> cy_call_twoargs(f=py_call_twoargs, arg=132) - (132, 'twoargs') - >>> cy_call_twoargs(arg=132, f=py_call_twoargs) - (132, 'twoargs') + >>> cy_call_two_kwargs(py_call_twoargs, arg=132) + (132, 'two-kwargs') + >>> cy_call_two_kwargs(f=py_call_twoargs, arg=132) + (132, 'two-kwargs') + >>> cy_call_two_kwargs(arg=132, f=py_call_twoargs) + (132, 'two-kwargs') + + >>> class Class(object): + ... def method(self, arg, arg2): return arg, arg2 + + >>> cy_call_two_kwargs(Class().method, 123) + (123, 'two-kwargs') """ - return f(arg2='twoargs', arg1=arg) + return f(arg2='two-kwargs', arg=arg) def cy_call_starargs(*args): @@ -92,6 +115,14 @@ def cy_call_pos_and_starargs(f, *args): (123, (321,)) >>> cy_call_pos_and_starargs(py_call_pos_and_starargs, 123, 321, 234) (123, (321, 234)) + + >>> class Class(object): + ... def method(self, arg, arg2): return arg, arg2 + + >>> cy_call_pos_and_starargs(Class().method, 123, 321) + (123, 321) + >>> cy_call_pos_and_starargs(Class.method, Class(), 123, 321) + (123, 321) """ return f(args[0] if args else 'no-arg', *args[1:]) @@ -161,5 +192,41 @@ def cy_call_kw_and_starstarargs(f=None, arg1=None, **kw): [('a', 123), ('arg', None), ('b', 321)] >>> cy_call_kw_and_starstarargs(arg1=234, **kw) [('a', 123), ('arg', 234), ('b', 321)] + + >>> class Class2(object): + ... def method(self, arg, arg2): return arg, arg2 + + >>> cy_call_kw_and_starstarargs(Class2().method, arg1=123, arg2=321) + (123, 321) """ return (f or py_call_starstarargs)(arg=arg1, **kw) + + +def cy_call_pos_and_starstarargs(f=None, arg1=None, **kw): + """ + >>> cy_call_pos_and_starstarargs(arg=123) + ((None,), [('arg', 123)]) + >>> cy_call_pos_and_starstarargs(arg1=123) + ((123,), []) + >>> cy_call_pos_and_starstarargs(arg=123, arg2=321) + ((None,), [('arg', 123), ('arg2', 321)]) + >>> cy_call_pos_and_starstarargs(arg1=123, arg2=321) + ((123,), [('arg2', 321)]) + + >>> class Class2(object): + ... def method(self, arg, arg2=None): return arg, arg2 + + >>> cy_call_pos_and_starstarargs(Class2().method, 123) + (123, None) + >>> cy_call_pos_and_starstarargs(Class2().method, 123, arg2=321) + (123, 321) + >>> cy_call_pos_and_starstarargs(Class2().method, arg1=123, arg2=321) + (123, 321) + >>> cy_call_pos_and_starstarargs(Class2.method, Class2(), arg=123) + (123, None) + >>> cy_call_pos_and_starstarargs(Class2.method, Class2(), arg=123, arg2=321) + (123, 321) + >>> cy_call_pos_and_starstarargs(Class2.method, arg1=Class2(), arg=123, arg2=321) + (123, 321) + """ + return (f or py_call_args_and_starstarargs)(arg1, **kw)