language_level
est utilisé pour indiquer dans quelle version de Python le fichier pyx est écrit. Ainsi, pour language_level=3
le comportement du code pyx qui en résulte est comme s'il était exécuté en Python3, même lorsque l'extension résultante est exécutée avec Python2 (voir une explication plus détaillée aquí ).
Niveau de langue 3str
signifie "sémantique Python3, mais avec des littéraux str (également dans Python2.7)". - donc str
dans le nom. Quelles sont exactement les conséquences ?
Python3 : Lorsqu'il est construit dans/pour Python3, il n'y a pas de différences entre les niveaux. 3
et le niveau 3str
.
Dans Python3, str
es unicode
donc le type de
# foo.pyx
def test():
return type("aaa")
restera la même ( str
) pour language_level=3
y language_level=3str
.
Python2 : La situation est différente lorsqu'il s'agit de construire avec/pour Python2. avec language_level=3
le résultat de ce qui précède test
-La fonction sera unicode
et avec language_level=3str
le résultat sera str
(qui est un octet dans Python2). Mais aussi pour Python2, dans tous les autres cas, 3
y 3str
ont le même comportement.
Ce serait une erreur de penser, que
cdef char *c_string = "some string"
n'a pas pu être construit avec language_level=3
(et construit avec succès avec 3str
pour Python2, comme "une certaine chaîne" ont été bytes
), car "some string"
est unicode et les littéraux unicodes ne peuvent être coercitifs qu'à l'égard de Py_UNICODE*
.
Le littéral du côté droit n'est pas un objet Python au départ, mais juste une chaîne C dans le code C généré.