Contexte
Dans les versions >=2021.2 d'InterSystems IRIS, nous pouvons utiliser le [binaire irispython pour écrire directement du code python au-dessus de nos instances IRIS] (https://docs.intersystems.com/iris20212/csp/docbook/DocBook.UI.Page.cls?...). Cela nous permet d'utiliser des paquets python, d'appeler des méthodes, de faire des requêtes SQL et de faire à peu près tout ce qui se fait en Objectscript mais en python.
Par exemple, ci-dessous, je vérifie si un espace de noms est présent :
#!/usr/irissys/bin/irispython
import iris
# call arbitrary class methods
result = iris.cls('%SYS.Namespace').Exists('USER')
if result == 1:
print(f"Namespace USER is present")
Mais que se passe-t-il si ma méthode dans IRIS a des paramètres spéciaux tels que les paramètres
Output
etByRef
?
Comment utiliser les paramètresOutput
dans irispython ?
Par exemple, Ens.Director a beaucoup de paramètres de sortie sur ses méthodes, comment puis-je utiliser ces paramètres en python ?
Ens.Director:GetProductionStatus
// An example method stub from Ens.Director
ClassMethod GetProductionStatus(Output pProductionName As %String, Output pState As %Integer...
Essayer les méthodes de variables normales
À première vue, vous pouvez essayer ce qui suit :
import os
# Set namespace the manual way
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# TEST 1 avec variables de sortie
productionName, productionState = None, None
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState)
print("Success? -- {}".format(productionState != None))
Mais les deux tests ne renvoient pas les variables de sortie ! Vous pouvez essayer vous-même sur n'importe quel espace de noms Ensemble
Utilisation de iris.ref
L'utilitaire irispython iris.ref
peut être utilisé pour capturer les variables Output
et ByRef
.
- Créer un objet
iris.ref()
. - Appelez votre méthode ObjectScript
- Utiliser la variable
.value
pour obtenir le résultat de ce paramètre
import os
# Définir l'espace en dur
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# TEST 2 avec des variables de sortie
productionName, productionState = iris.ref('productionName'), iris.ref('productionState')
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState)
print("Status: {}".format(status))
# see .value
print("Production: {}".format(productionName.value))
# see .value
print("Production State: {}".format(productionState.value))