Limitations¶
Unsupported Python Features¶
One of our goals is to make Cython as compatible as possible with standard Python. This page lists the things that work in Python but not in Cython. As Cython matures, the items in this list should go away.
Generators and generator expressions¶
The yield keyword is not yet supported. This is work in progress.
Since Cython 0.13, some generator expressions are supported when they
can be transformed into inlined loops in combination with builtins,
e.g. sum(x*2 for x in seq)
. As of 0.14, the supported builtins
are list()
, set()
, dict()
, sum()
, any()
,
all()
, sorted()
.
Other Current Limitations¶
- The
globals()
builtin returns the last Python callers globals, not the current function’s locals. This behavior should not be relied upon, as it will probably change in the future. - The :fun:`locals` builtin can only be used if all local variables can be converted to Python objects, and returns a dict.
- Class and function definitions cannot be placed inside control structures.
Semantic differences between Python and Cython¶
Behaviour of class scopes¶
In Python, referring to a method of a class inside the class definition, i.e.
while the class is being defined, yields a plain function object, but in
Cython it yields an unbound method [1]. A consequence of this is that the
usual idiom for using the classmethod()
and staticmethod()
functions,
e.g.:
class Spam:
def method(cls):
...
method = classmethod(method)
will not work in Cython. This can be worked around by defining the function
outside the class, and then assigning the result of classmethod
or
staticmethod
inside the class, i.e.:
def Spam_method(cls):
...
class Spam:
method = classmethod(Spam_method)
This will change in the near future.
Footnotes
[1] | The reason for the different behaviour of class scopes is that
Cython-defined Python functions are PyCFunction objects, not
PyFunction objects, and are not recognised by the machinery that creates a
bound or unbound method when a function is extracted from a class. To get
around this, Cython wraps each method in an unbound method object itself
before storing it in the class’s dictionary. |