Antecedentes
En las versiones de InterSystems IRIS >=2021.2 podemos usar irispython para escribir directamente código python encima de nuestras instancias IRIS. Esto nos permite usar paquetes de python, llamar a métodos, hacer consultas SQL y hacer casi cualquier cosa en Objectscript excepto pythonic.
Por ejemplo, a continuación compruebo si hay un namespace:
#!/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")
Pero, ¿qué pasa si mi método en IRIS tiene parámetros especiales como
Output
yByRef
?
¿Cómo podemos usar los parámetros deSalida
en irispython?
Por ejemplo, Ens.Director tiene muchos parámetros de salida en sus métodos, ¿cómo puedo usar estos parámetros en python?
Ens.Director:GetProductionStatus
// Un código auxiliar de método de ejemplo de Ens.Director
ClassMethod GetProductionStatus(Output pProductionName As %String, Output pState As %Integer...
Probando los métodos de variables normales
A primera vista, puedes intentar lo siguiente:
import os
# Establecer el namespace de forma manual
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# PRUEBA 1 con variables de salida
productionName, productionState = None, None
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState)
print("Success? -- {}".format(productionState != None))
¡Pero ambas pruebas no devolverán las variables de salida! Puedes probar esto por ti mismo en cualquier namespace de Ensemble
Usando iris.ref
La utilidad irispython iris.ref
se puede utilizar para capturar las variables Output
y ByRef
.
- Crea un objeto
iris.ref()
- Llama a tu Método ObjectScript
- Utiliza la variable
.value
para obtener el resultado de ese parámetro
import os
# Establecer el namespace de la manera difícil
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# PRUEBA 2 con variables de salida
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))