c = pyfunction(fun_handle)
| Paramètre | Description |
|---|---|
| fun_handle | un handle de fonction : anonyme (par exemple @(x) x .^ 2) ou nommé (par exemple @sin). |
| Paramètre | Description |
|---|---|
| c | un objet appelable Python (py.builtin_function_or_method) qui transmet ses appels au handle de fonction Nelson. |
c = pyfunction(fun_handle) encapsule un handle de fonction Nelson dans un objet appelable Python. Lorsque du code Python appelle c, le handle de fonction Nelson encapsulé est exécuté de manière synchrone dans la même session Nelson et son résultat est renvoyé à Python.
C'est le sens inverse de pyrun : au lieu que Nelson appelle Python, c'est Python qui appelle Nelson. Passez l'appelable à Python via les arguments nom-valeur de pyrun ou de pyrunfile, puis appelez-le depuis le code Python. Il peut être fourni à toute API Python attendant un appelable, par exemple un scoreur, un noyau ou un transformateur personnalisé de scikit-learn.
Lorsque Python appelle l'appelable encapsulé, les arguments positionnels sont convertis en valeurs Nelson (les scalaires Python et les tableaux NumPy suivent les mêmes règles que les autres conversions de python_engine), le handle de fonction Nelson est évalué, et sa sortie unique est reconvertie en objet Python. Les handles qui ne renvoient aucune valeur produisent None côté Python.
Une erreur Nelson levée dans le rappel devient une exception Python dont le message contient le message Nelson, puis elle est remontée proprement dans Nelson.
Limitations. Le rappel est intra-processus et mono-thread : le handle de fonction Nelson s'exécute toujours sur le thread de l'interpréteur Nelson. Il est conçu pour une utilisation mono-thread uniquement. Avec scikit-learn et joblib, utilisez n_jobs=1 ; les backends qui créent des processus ou des threads de travail (n_jobs supérieur à 1) ne peuvent pas rappeler la session Nelson parente, et un appel provenant d'un thread inattendu échoue avec une erreur claire au lieu de corrompre la session. Appeler à nouveau pyrun ou pyrunfile depuis un rappel n'est pas pris en charge et lève une erreur au lieu de provoquer un interblocage. Une seule sortie est prise en charge.
sq = @(x) x .^ 2;
f = pyfunction(sq);
y = pyrun("r = g(4.0)", "r", "g", f)
add1 = @(v) double(v) + 1;
f = pyfunction(add1);
o = pyrun("import numpy as np; o = g(np.array([1.0, 2.0, 3.0]))", "o", "g", f)
f = pyfunction(@sin);
z = pyrun("r = g(0.0)", "r", "g", f)
| Version | Description |
|---|---|
| 2.0.0 | version initiale |