文章
· 七月 17, 2022 阅读大约需 4 分钟

第八章 使用嵌入式 Python (五)

第八章 使用嵌入式 Python (五)

通过引用传递参数

ObjectScript 编写的方法中的参数可以通过值或引用传递。在下面的方法中,签名中第二个和第三个参数前面的 ByRef 关键字表示它们打算通过引用传递。

ClassMethod SandwichSwitch(bread As %String, ByRef filling1 As %String, ByRef filling2 As %String)
{
    set bread = "whole wheat"
    set filling1 = "almond butter"
    set filling2 = "cherry preserves"
}

ObjectScript 调用方法时,在参数前放置一个句点以通过引用传递它,如下所示:

USER>set arg1 = "white bread"

USER>set arg2 = "peanut butter"

USER>set arg3 = "grape jelly"

USER>do ##class(User.EmbeddedPython).SandwichSwitch(arg1, .arg2, .arg3)

USER>write arg1
white bread
USER>write arg2
almond butter
USER>write arg3
cherry preserves

从输出中可以看出,调用 SandwichSwitch() 后变量 arg1 的值保持不变,而变量 arg2arg3 的值发生了变化。

由于 Python 本身不支持按引用调用,因此需要使用 iris.ref() 方法创建一个引用,以将每个要按引用传递的参数传递给该方法:

>>> import iris
>>> arg1 = "white bread"
>>> arg2 = iris.ref("peanut butter")
>>> arg3 = iris.ref("grape jelly")
>>> iris.cls('User.EmbeddedPython').SandwichSwitch(arg1, arg2, arg3)
>>> arg1
'white bread'
>>> arg2.value
'almond butter'
>>> arg3.value
'cherry preserves'

可以使用 value 属性访问 arg2arg3 的值,并查看它们在调用该方法后发生了变化。

Passing Values for True, False, and None

%SYS.Python 类具有 True()False()None() 方法,它们分别表示 Python 标识符 TrueFalseNone

例如:

USER>zwrite ##class(%SYS.Python).True()
2@%SYS.Python  ; True  ; <OREF>

如果需要将 TrueFalseNone 传递给 Python 方法,这些方法很有用。以下示例使用关键字或命名参数中显示的方法。

USER>do obj.mymethod(##class(%SYS.Python).True(), ##class(%SYS.Python).False(), ##class(%SYS.Python).None())
foo=True, bar=False, baz=None

如果将未命名的参数传递给需要关键字参数的 Python 方法,Python 会按照传入的顺序处理它们。

请注意,在检查 Python 方法返回给 ObjectScript 的值时,不需要使用方法 True()False()None()

假设Python模块mymodule也有一个方法isgreaterthan(),定义如下:

def isgreaterthan(a, b):
    return a > b

Python 中运行时,可以看到如果参数 a 大于 b,则该方法返回 True,否则返回 False

>>> mymodule.isgreaterthan(5, 4)
True

但是,当从 ObjectScript 调用时,返回值为 1,而不是 Python 标识符 True

USER>zwrite obj.isgreaterthan(5, 4)
1

Dictionaries

Python 中,字典通常用于以键/值对的形式存储数据,例如:

>>> mycar = {
...     "make": "Toyota",
...     "model": "RAV4",
...     "color": "blue"
... }
>>> print(mycar)
{'make': 'Toyota', 'model': 'RAV4', 'color': 'blue'}
>>> print(mycar["color"])
blue

ObjectScript 方面,可以使用 Python 内置模块的 dict() 方法来操作 Python 字典:

USER>set mycar = ##class(%SYS.Python).Builtins().dict()

USER>do mycar.setdefault("make", "Toyota")

USER>do mycar.setdefault("model", "RAV4")

USER>do mycar.setdefault("color", "blue")

USER>zwrite mycar
mycar=2@%SYS.Python  ; {'make': 'Toyota', 'model': 'RAV4', 'color': 'blue'}  ; <OREF>

USER>write mycar."__getitem__"("color")
blue

上面的示例使用字典方法 setdefault() 来设置键的值,并使用 __getitem__() 来获取键的值。

Lists

Python 中,列表存储值的集合,但没有键。列表中的项目通过其索引访问。

>>> fruits = ["apple", "banana", "cherry"]
>>> print(fruits)
['apple', 'banana', 'cherry']
>>> print(fruits[0])
apple

ObjectScript 中,可以使用 Python 内置模块的 list() 方法处理 Python 列表:

USER>set l = ##class(%SYS.Python).Builtins().list()

USER>do l.append("apple")

USER>do l.append("banana")

USER>do l.append("cherry")

USER>zwrite l
l=13@%SYS.Python  ; ['apple', 'banana', 'cherry']  ; <OREF>

USER>write l."__getitem__"(0)
apple

上面的示例使用列表方法 append() 将项目附加到列表中,并使用 __getitem__() 获取给定索引处的值。 (Python 列表是从零开始的。)

讨论 (0)1
登录或注册以继续