Bloques de programa anidados (Python)

Desde Python, puede someter la sintaxis de comandos que contiene un bloque BEGIN PROGRAM , lo que le permite anidar bloques de programa. Esto se puede hacer incluyendo el bloque de programa anidado en un archivo de sintaxis de comandos independiente y sometiendo un comando INSERT para leer en el bloque. También se puede realizar enviando el bloque de programa anidado desde una función Python definida por el usuario.

Ejemplo: anidamiento de bloques de programa utilizando el mandato INSERT

import spss
spss.Submit("INSERT FILE='/myprograms/nested_block.sps'.")

El archivo /myprograms/nested_block.sps contendría un bloque BEGIN PROGRAM , como en:

BEGIN PROGRAM PYTHON3.
import spss
<Python code>
END PROGRAM.
Nota: No puede importar un módulo Python que contenga código que anide un bloque de programa, como el código anterior que utiliza el mandato INSERT para insertar un archivo que contenga un bloque de programa. Si desea encapsular bloques de programa anidados en un módulo Python que se puede importar, incluya el código de anidamiento en una función definida por el usuario tal como se muestra en el ejemplo siguiente.

Ejemplo: anidamiento de bloques de programa con una función Python definida por el usuario

import spss, myfuncs
myfuncs.demo()
  • myfuncs es un módulo Python definido por el usuario que contiene la función (demo) que enviará el bloque de programa anidado.

    Un módulo Python es simplemente un archivo de texto que contiene definiciones y sentencias Python . Puede crear un módulo con un IDE de Python , o con cualquier editor de texto, guardando un archivo con una extensión de .py. El nombre del archivo, sin la extensión .py , es el nombre del módulo.

  • La sentencia import incluye myfuncs para que se cargue junto con el módulo spss . Para asegurarse de que Python puede encontrar el módulo, es posible que desee guardarlo en el directorio Python "site-packages", normalmente /Python310/Lib/site-packages.
  • El código myfuncs.demo() llama a la función demo en el módulo myfuncs .

A continuación se muestra un ejemplo del contenido de myfuncs.

import spss
def demo():
   spss.Submit("""
BEGIN PROGRAM PYTHON3.
<Python code>
END PROGRAM.""")
  • El módulo myfuncs de ejemplo incluye una sentencia import spss . Esto es necesario puesto que una función del módulo utiliza una función del módulo spss , específicamente, la función Submit .
  • El bloque de programa anidado se encuentra dentro de una serie tri-entrecomillada de Python . Las series entre comillas triples le permiten especificar un bloque de mandatos en varias líneas, pareciéndose a la forma en que normalmente puede escribir la sintaxis del mandato.
  • Observe que spss.Submit está sangrado pero el bloque BEGIN PROGRAM no. Las sentencias Python que forman el cuerpo de una función Python definida por el usuario deben estar sangradas. El nivel de sangría es arbitrario pero debe ser el mismo para todas las sentencias del cuerpo de la función. El bloque BEGIN PROGRAM se pasa como un argumento de serie a la función Submit y lo procesa IBM® SPSS® Statistics como un bloque de sentencias Python . Las sentencias Python no se sangran a menos que formen parte de un grupo de sentencias, como en una definición de función o clase, una expresión condicional o una estructura de bucle.

Notas

  • Puede tener hasta cinco niveles de anidación.
  • Las variables Python especificadas en un bloque de programa anidado son locales para dicho bloque a menos que se especifiquen como variables globales. Además, las variables de Python especificadas en un bloque de programa que invoca un bloque anidado se pueden leer, pero no modificar, en el bloque anidado.
  • Los bloques de programa anidados pueden ser bloques de programa Python o bloques de programa R.
  • Si una función Submit que contiene una serie entre comillas triples anida un bloque de programa Python que contiene otra serie entre comillas triples, utilice un tipo diferente de comillas triples en el bloque anidado. Por ejemplo, si el bloque externo utiliza comillas dobles triples, utilice comillas simples triples en el bloque anidado.