实现代码

实现代码接收已解析的语法,然后执行所请求的操作。 代码 (无论是以 Python, R 还是 Java 编写) 必须包含名为 Run 的函数,该函数具有接受已解析语法的单个自变量。

下面的代码样本中显示了示例 MYORG GETURL EXCEL 扩展命令的 Python 模块的内容 (在上一节中进行了讨论)。 该代码包含 spssauxextension Python 模块的 import 语句,这些模块由代码使用,并随 SPSS® Statistics一起安装。 根据以下内容中描述的命名约定的要求, Python 模块本身必须命名为 MYORG_GETURL_EXCEL.py

该模块包含两个函数: RungeturlexcelRun 函数采用已解析的语法,对其进行验证,抽取关键字的值,然后调用 geturlexcel 以实现所请求的操作。 将实现代码分为 Run 函数 (用于处理提交的语法) 和主实现函数 (用于执行请求的操作) 是 IBM® SPSS创建的所有扩展命令的常规功能。


import spssaux
from extension import Template, Syntax, processcmd
         
def Run(args):
    oobj = Syntax([
        Template("URL", subc="",  ktype="literal", var="url", islist=True),
        Template("FILETYPE", subc="OPTIONS", ktype="str", var="filetype", vallist=["xls","xlsx"]),
        Template("SHEETNUMBER", subc="OPTIONS", ktype="int", var="sheetnumber"),
        Template("READNAMES", subc="OPTIONS", ktype="str", var="readnames", vallist=["on","off"])])
    args = args[args.keys()[0]]
    processcmd(oobj, args, geturlexcel)

def geturlexcel(url, filetype="xls", sheetnumber=1, readnames="ON"):
    kwargs = {}
    url = "".join(url)
    kwargs["filetype"] = filetype
    kwargs["sheetid"] = sheetnumber 
    kwargs["readnames"] = readnames
    spssaux.openDataFileFromUrl(url, **kwargs)

Run 函数使用 Template 类, Syntax 类和 processcmd 函数。 这些函数设计为一起使用,并极大地简化了使用解析语法 (包含在 Run 函数的 args 参数中) 的任务。

  • Template 类指定如何处理扩展命令的语法中的特定关键字。 每个子命令的每个关键字都必须具有 Template 类的关联实例。
    • Template 类构造函数的第一个自变量是关键字的名称。
    • 自变量 subc 指定包含关键字的子命令的名称。 如果该关键字属于匿名子命令,那么可以省略自变量 subc 或将其设置为空字符串,如此处针对 URL 关键字所示。
    • 自变量 ktype 指定关键字的类型,例如关键字是指定变量名,字符串还是浮点数。
    • 自变量 var 指定实现函数 (在此示例中为geturlexcel ) 的自变量的名称,该实现函数接收为关键字指定的值。
    • 用于 FILETYPEREADNAMES的自变量 vallist指定关键字的允许值列表。 对于在 Template 构造函数中指定为 ktype="str" 的关键字,在验证之前会将该关键字的已提交值转换为小写,因此允许的值列表以小写形式指定。
  • Syntax 类验证 Template 对象指定的语法。 类是使用一个或多个 Template 对象的序列进行实例化的,如本示例中所示。
  • processcmd 函数从提交的语法中抽取关键字的值,然后调用实现函数以执行所请求的操作。
    • processcmd 函数的第一个自变量是命令的 Syntax 对象。
    • 对于 Python,解析的语法将传递到具有单个顶级条目的复杂嵌套 Python 字典中的 Run 函数。 processcmd 的第二个自变量是此顶级条目,由表达式 args[args.keys()[0]]提供。
    • processcmd 的第三个自变量是实现函数的名称。 Template 对象指定的关键字值将作为一组关键字参数传递到实现函数。 在此示例中,将使用以下特征符来调用实现函数 geturlexcel :
      
      geturlexcel(URL=<URL>,filetype=<FILETYPE>,sheetnumber=<SHEETNUMBER>,readnames=<READNAMES>)
      

      其中 URL 是为 URL 关键字指定的值,其他关键字也是如此。

      注:
      • 如果在实现函数中发生 Python 异常,那么将禁止 Python 回溯,但会显示错误消息。 要显示回溯,请将 SPSS_EXTENSIONS_RAISE 环境变量设置为 "true"。
      • 如果实现函数的特征符没有参数的缺省值,那么如果提交的语法不包含参数的值,那么将发生错误。

geturlexcel 函数接收为所提交语法中的关键字指定的值,然后打开所请求的 Excel 文件。 该函数从随 SPSS Statistics一起安装的 spssaux 模块调用 openDataFileFromUrl 函数以打开该文件。

SPSS Statistics一起安装的 extension 模块提供了 Template 类, Syntax 类和 processcmd 函数的帮助。 您可以在导入 extension 模块后从 help(extension) 访问帮助。

尽管上述示例适用于 Python,但用于创建实现代码的方法可以用于 R 或 Java 中的扩展命令。
  • 有关在 R 中创建扩展命令的示例,请参阅 IBM SPSS Statistics 帮助系统中的教程 "使用 R"。 在 "帮助" 系统中的 " IBM SPSS Statistics集成插件 for R 帮助> R 集成包" 下提供了有关 R 中 spsspkg.Templatespsspkg.Syntaxspsspkg.processcmd 函数 (上一个示例中使用的 Python 函数的等效函数) 的帮助。
  • 对于 Java ,请参阅 SPSS Statistics 帮助系统中的 "Integration Plug-in for Java 用户指南> Integration Plug-in for Java 入门" 下的 "在 Java 中创建 IBM SPSS Statistics 扩展命令" 主题。 Java 中 TemplateSyntaxprocesscmd 函数的帮助包含在帮助系统中 Integration Plug-in for Java API Reference 下的 Extension 类的帮助中。
  • 扩展命令的许多实现代码文件随 SPSS Statistics一起安装,可能用作示例。 这些文件位于计算机上安装扩展命令的位置。 要查看位置,请从 SPSS Statistics中运行 SHOW EXTPATHS 语法命令。 输出将在标题“扩展命令的位置”下显示位置列表。 文件将安装到列表中的第一个可写入位置。

命名约定

包含扩展命令的 Run 函数的 Python 模块, R 源文件或 Java 类文件 (或 JAR 文件) 必须遵循以下命名约定:

  • Python. Run 函数必须位于与命令同名的 Python 模块文件中,例如,对于名为 MYCOMMAND的扩展命令,位于 Python 模块文件 MYCOMMAND.py 中。 Python 模块文件的名称必须为大写,尽管命令名称本身不区分大小写。 对于多字命令名,将单词之间的空格替换为下划线。 例如,对于名为 MY COMMAND的扩展命令,关联的 Python 模块为 MY_COMMAND.py
  • R. Run 函数必须驻留在与命令同名的 R 源文件或 R 程序包中,例如,对于名为 MYRFUNC的扩展命令,位于名为 MYRFUNC.R 的源文件中。 R 源文件或包的名称必须为大写,尽管命令名本身不区分大小写。 对于多字命令名,请将单词之间的空格替换为 R 源文件的下划线和 R 包的句点。 例如,对于名为 MY RFUNC的扩展命令,关联的 R 源文件是 MY_RFUNC.R,而实现该命令的 R 程序包名为 MY.RFUNC.R。 源文件或包应包含装入代码所使用的 R 函数所需的任何 library 函数调用。
  • Java。 Run 函数必须位于与命令同名的 Java 类文件或 JAR 文件中,例如,对于名为 MYCOMMAND的扩展命令,必须位于名为 MYCOMMAND.class 的类文件中。 Java 类文件或 JAR 文件的名称必须为大写,尽管命令名本身不区分大小写。 对于多字命令名,在构造 Java 类文件或 JAR 文件的名称时,请将字之间的空格替换为下划线。 例如,对于名为 MY COMMAND的扩展命令,关联的 Java 类文件为 MY_COMMAND.class

命令语法错误

语法错误 (例如,没有为指定为 Integer的参数提供整数) 由 IBM SPSS Statistics 处理,并阻止模块运行。 在这方面,实现代码不需要处理与扩展命令的语法的 XML 规范的偏差。

正在生成输出

生成输出并将其发送到 IBM SPSS Statistics 由实现代码进行处理。

  • 对于 Python 和 Java ,实现代码负责指定在查看器中标注透视表输出的过程名称 (与扩展命令相关联)。 换言之,与内置 IBM SPSS Statistics 过程 (例如 FREQUENCIES) 不同,不会自动将扩展命令名称与用于标注来自该命令的透视表输出的名称相关联。 对于 Python,过程名称是 spss.StartProcedure 函数的第一个自变量,用于包装生成输出的语句。 对于 Java ,过程名称是用于打包生成输出的语句的 StatsUtil.startProcedure 函数的第一个自变量。
  • 对于 R ,与扩展命令的透视表输出相关联的缺省名称为 R。 对于 IBM SPSS Statistics V18 及更高版本,可以通过将输出语句包装在 spsspkg.StartProcedure - spsspkg.EndProcedure 块中来定制名称。 然后,过程名称是 spsspkg.StartProcedure 函数的第一个自变量。

全球化

您可以对实现代码生成的消息和输出进行全球化。 对于 Python,请参阅 SPSS Statistics 帮助系统中的 "Integration Plug-in for Python Help> Python Integration Package for IBM SPSS Statistics > Python 程序简介" 下的 "本地化来自 Python 程序的输出" 主题。 对于 R ,请参阅 SPSS Statistics 帮助系统中 "集成插件 for R 帮助> 使用 R Integration Package for IBM SPSS Statistics" 下的主题 "本地化来自 R 的输出"。