Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Xavier Thompson
cython
Commits
173f908f
Commit
173f908f
authored
8 years ago
by
Stefan Behnel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add a dedicated test for calling back and forth between Python and Cython with various signatures
parent
e7c824fb
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
165 additions
and
0 deletions
+165
-0
tests/run/call_py_cy.pyx
tests/run/call_py_cy.pyx
+165
-0
No files found.
tests/run/call_py_cy.pyx
0 → 100644
View file @
173f908f
# mode: run
# tag: cyfunction,call,python
# cython: binding=True
#######
# Test that Cython and Python functions can call each other in various signature combinations.
#######
py_call_noargs
=
eval
(
"lambda: 'noargs'"
)
py_call_onearg
=
eval
(
"lambda arg: arg"
)
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())"
)
def
cy_call_noargs
():
"""
>>> cy_call_noargs()
'noargs'
"""
return
py_call_noargs
()
def
cy_call_onearg
(
f
):
"""
>>> cy_call_onearg(py_call_onearg)
'onearg'
>>> try: cy_call_onearg(py_call_noargs)
... except TypeError: pass
... else: print("FAILED!")
>>> try: cy_call_onearg(py_call_twoargs)
... except TypeError: pass
... else: print("FAILED!")
"""
return
f
(
'onearg'
)
def
cy_call_twoargs
(
f
,
arg
):
"""
>>> cy_call_twoargs(py_call_twoargs, 132)
(132, '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')
"""
return
f
(
arg2
=
'twoargs'
,
arg1
=
arg
)
def
cy_call_starargs
(
*
args
):
"""
>>> cy_call_starargs()
()
>>> cy_call_starargs(1)
(1,)
>>> cy_call_starargs(1, 2)
(1, 2)
>>> cy_call_starargs(1, 2, 3)
(1, 2, 3)
"""
return
py_call_starargs
(
*
args
)
def
cy_call_pos_and_starargs
(
f
,
*
args
):
"""
>>> cy_call_pos_and_starargs(py_call_onearg)
'no-arg'
>>> cy_call_pos_and_starargs(py_call_onearg, 123)
123
>>> cy_call_pos_and_starargs(py_call_twoargs, 123, 321)
(123, 321)
>>> cy_call_pos_and_starargs(py_call_starargs)
('no-arg',)
>>> cy_call_pos_and_starargs(py_call_starargs, 123)
(123,)
>>> cy_call_pos_and_starargs(py_call_starargs, 123, 321)
(123, 321)
>>> cy_call_pos_and_starargs(py_call_pos_and_starargs)
('no-arg', ())
>>> cy_call_pos_and_starargs(py_call_pos_and_starargs, 123)
(123, ())
>>> cy_call_pos_and_starargs(py_call_pos_and_starargs, 123, 321)
(123, (321,))
>>> cy_call_pos_and_starargs(py_call_pos_and_starargs, 123, 321, 234)
(123, (321, 234))
"""
return
f
(
args
[
0
]
if
args
else
'no-arg'
,
*
args
[
1
:])
def
cy_call_starstarargs
(
**
kw
):
"""
>>> kw = {}
>>> cy_call_starstarargs(**kw)
[]
>>> kw = {'a': 123}
>>> cy_call_starstarargs(**kw)
[('a', 123)]
>>> kw = {'a': 123, 'b': 321}
>>> cy_call_starstarargs(**kw)
[('a', 123), ('b', 321)]
"""
return
py_call_starstarargs
(
**
kw
)
def
cy_call_kw_and_starstarargs
(
f
=
None
,
arg1
=
None
,
**
kw
):
"""
>>> kw = {}
>>> cy_call_kw_and_starstarargs(**kw)
[('arg', None)]
>>> try: cy_call_kw_and_starstarargs(py_call_noargs, **kw)
... except TypeError: pass
>>> try: cy_call_kw_and_starstarargs(py_call_twoargs, **kw)
... except TypeError: pass
... else: print("FAILED!")
>>> cy_call_kw_and_starstarargs(py_call_onearg, **kw)
>>> cy_call_kw_and_starstarargs(f=py_call_onearg, **kw)
>>> cy_call_kw_and_starstarargs(py_call_pos_and_starargs, **kw)
(None, ())
>>> kw = {'arg1': 123}
>>> cy_call_kw_and_starstarargs(**kw)
[('arg', 123)]
>>> cy_call_kw_and_starstarargs(py_call_onearg, **kw)
123
>>> cy_call_kw_and_starstarargs(f=py_call_onearg, **kw)
123
>>> cy_call_kw_and_starstarargs(py_call_twoargs, arg2=321, **kw)
(123, 321)
>>> cy_call_kw_and_starstarargs(f=py_call_twoargs, arg2=321, **kw)
(123, 321)
>>> try: cy_call_kw_and_starstarargs(py_call_twoargs, **kw)
... except TypeError: pass
... else: print("FAILED!")
>>> try: cy_call_kw_and_starstarargs(py_call_twoargs, arg2=321, other=234, **kw)
... except TypeError: pass
... else: print("FAILED!")
>>> cy_call_kw_and_starstarargs(py_call_pos_and_starargs, **kw)
(123, ())
>>> try: cy_call_kw_and_starstarargs(arg=321, **kw) # duplicate kw in Python call
... except TypeError: pass
... else: print("FAILED!")
>>> kw = {'a': 123}
>>> cy_call_kw_and_starstarargs(**kw)
[('a', 123), ('arg', None)]
>>> cy_call_kw_and_starstarargs(arg1=321, **kw)
[('a', 123), ('arg', 321)]
>>> kw = {'a': 123, 'b': 321}
>>> cy_call_kw_and_starstarargs(**kw)
[('a', 123), ('arg', None), ('b', 321)]
>>> cy_call_kw_and_starstarargs(arg1=234, **kw)
[('a', 123), ('arg', 234), ('b', 321)]
"""
return
(
f
or
py_call_starstarargs
)(
arg
=
arg1
,
**
kw
)
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment