代表绑定到 ExternalSessionObject 的外部对象.
ExternalObject
外部运算器列表 »代表绑定到 ExternalSessionObject 的外部对象.
更多信息
- ExternalObject 是某些 ExternalEvaluate 系统(如 "Python"、"Ruby"、"NodeJS")返回的外部数据的引用.
- 一个ExternalObject[…] 特用于一个具体的 ExternalSessionObject,它有可能不是持久性的.
- 在大部分运算器中,ExternalObject[…]["name"] 恒等于 ExternalObject[…][ExternalOperation["GetAttribute", "name"]].
- ExternalObject[…][ExternalOperation[…]] 等价于 ExternalEvaluate[session,ExternalOperation[…][ExternalObject[…]]],其中 session 由 ExternalObject[…] 表明.
- ExternalObject[…][op1,op2,…] 恒等于 ExternalEvaluate[session,RightComposition[op1,op2,…][ExternalObject[…]]].
- ExternalObject[…][{op1,op2,…}] 恒等于 ExternalEvaluate[session, {op1[ExternalObject[…]],op2[ExternalObject[…]],…}].
范例
打开所有单元 关闭所有单元范围 (7)
为 Python 中的函数显示的键与内置函数和用户定义的函数有所不同:
py = StartExternalSession["Python"]ExternalEvaluate[py, "class MyObject: pass"];
ExternalEvaluate[py, "MyObject()"]DeleteObject[py]外部运算 (6)
"Eval" (2)
session = StartExternalSession["Python"]用包含有效 Python 代码的字符串创建一个 ExternalObject:
obj = ExternalEvaluate[session, <|"Command" -> "'2+2'", "ReturnType" -> "ExternalObject"|>]使用 "Eval" 操作将字符串转换为 Python 代码:
obj[ExternalOperation["Eval"]]DeleteObject[session]session = StartExternalSession["Python"]用包含有效 Python 代码和变量的字符串创建一个 ExternalObject:
obj = ExternalEvaluate[session, <|"Command" -> "'a+b'", "ReturnType" -> "ExternalObject"|>]在 "Eval"操作下,使用一个运算上下文,将字符串运算为 Python 代码:
obj[ExternalOperation["Eval", <|"a" -> 2, "b" -> 3|>]]DeleteObject[session]"Call" (1)
session = StartExternalSession["Python"]定义一个 ExternalObject,用 Python 创建一个函数:
obj = ExternalEvaluate[session, <|"Command" -> "max", "ReturnType" -> "ExternalObject"|>]通过运行 ExternalOperation "Call" 调用函数:
obj[ExternalOperation["Call", 1, 2]]"Call" 运算的任何参数都可以是 ExternalOperation:
obj[ExternalOperation["Call", 1, ExternalOperation["Eval", "2+2"]]]ExternalObject 也可用作参数:
n = ExternalEvaluate[session, <|"Command" -> "2+2", "ReturnType" -> "ExternalObject"|>]obj[ExternalOperation["Call", 1, n]]参数也可以直接在 ExternalEvaluate 中传递:
ExternalEvaluate[session, obj -> {1, 2}]ExternalEvaluate[session, "max(1, 2)"]DeleteObject[session]"GetAttribute" (1)
session = StartExternalSession[{"Python", "SessionProlog" -> "import datetime"}];返回日期时间对象的 ExternalObject:
now = ExternalEvaluate[session, <|"Command" -> "datetime.datetime.now()", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["GetAttribute", now, "year"]]使用 ExternalObject 子值也可以达到同样的效果:
now[ExternalOperation["GetAttribute", "year"]]对于 Python 运算器,"GetAttribute" 是默认操作,ExternalOperation 可以省略:
now["year"]ExternalEvaluate[session, "datetime.datetime.now().year"]DeleteObject[session]"SetAttribute" (1)
session = StartExternalSession[{"Python", "SessionProlog" -> "from decimal import getcontext, Decimal"}];context = ExternalEvaluate[session, "getcontext()"]ExternalEvaluate[session, ExternalOperation["SetAttribute", context, "prec", 6]]ExternalEvaluate[session, ExternalOperation["GetAttribute", context, "prec"]]ExternalEvaluate[session, "Decimal('0') + Decimal('0.123456789')"]ExternalEvaluate[session, "getcontext().prec = 6"]DeleteObject[session]"Cast" (1)
创建表示当前日期的 ExternalObject:
session = StartExternalSession["Python"];now = ExternalEvaluate[session, <|"Command" -> "import datetime; datetime.datetime.now()", "ReturnType" -> "ExternalObject"|>]使用 "Expression" 可将对象作为 Wolfram 语言表达式返回:
ExternalEvaluate[session, ExternalOperation["Cast", now, "Expression"]]Cast 操作也可以在 ExternalObject 子值中运行:
now[ExternalOperation["Cast", "Expression"]]符号 Expression 是相同运算的快捷方式:
now[Expression]now[ExternalOperation["Cast", "String"]]符号 String 是相同运算的快捷方式:
now[String]将对象以 ExternalObject 的形式返回:
now[ExternalOperation["Cast", "ExternalObject"]]ExternalObject 符号是相同运算的快捷方式:
now[ExternalObject]在 ExternalEvaluate 中使用 "ReturnType" 也能达到同样的效果:
ExternalEvaluate[session, <|"Command" -> now, "ReturnType" -> "String"|>]DeleteObject[session]属性和关系 (6)
ExternalOperation 可用于从 ExternalObject 中提取操作:
ExternalOperation[ExternalObject["Python", "2+2"]]使用 ExternalFunction 也可以做同样的运算:
ExternalOperation[ExternalFunction["Python", "str"]]ExternalOperation 可用作 ExternalObject 的参数:
ExternalObject["Python", "len"][ExternalOperation["Call", {1, 2, 3}]]op = ExternalOperation["Call", {1, 2, 3}][ExternalObject["Python", "len"]]可通过 ExternalEvaluate 执行:
ExternalEvaluate["Python", op]ExternalEvaluate["Python", "len((1, 2, 3))"]创建一个 ExternalObject,以便与 sys 模块一起使用:
sys = ExternalObject["Python", ExternalOperation["Import", "sys"]]当使用字符串时,"GetAttribute" 操作会在包括 Python 在内的大多数运算器中执行:
sys["maxsize"]sys[ExternalOperation["GetAttribute", "maxsize"]]session = StartExternalSession["Python"]创建 ExternalObject:
module = ExternalEvaluate[session, ExternalOperation["Import", "datetime"]]使用 ExternalFunction 在对象上运行方法:
ExternalFunction[module, "date"][2012, 10, 10]DeleteObject[session]session = StartExternalSession["Python"]为日期时间模块创建一个 ExternalObject:
datetime = ExternalEvaluate[session, ExternalOperation["Import", "datetime"]]创建一个包含当前日期的 ExternalObject 和一个包含 timedelta 的 ExternalObject:
{now, tenhours} = {datetime["datetime", "now" -> {}, ExternalObject], datetime["timedelta" -> {"hours" -> 10}, ExternalObject]}使用 ExternalFunction 发送回对象:
ExternalFunction[session, "lambda obj, n: obj + n"][now, tenhours]ExternalEvaluate 调用也可以做到这一点:
ExternalEvaluate[session, "lambda obj, n: obj + n" -> {now, tenhours}]使用 "ReturnType" 返回 String:
ExternalEvaluate[session, <|"Command" -> "lambda obj, n: obj + n", "Arguments" -> {now, tenhours}, "ReturnType" -> "String"|>]DeleteObject[session]可以使用 ExternalObject 中的多个参数来连接多个操作:
uuid = ExternalObject["Python", ExternalOperation["Import", "uuid"]]uuid[ExternalOperation["GetAttribute", "uuid4"], ExternalOperation["Call"], ExternalOperation["Cast", "String"]]uuid["uuid4" -> {}, String]可能存在的问题 (1)
如果不检查每一步的返回值,使用下限值连续运行操作可能会导致未定义的行为:
session = StartExternalSession[{"Python", "SessionProlog" -> "import datetime"}];obj = ExternalEvaluate[session, "datetime"]obj["date" ][ExternalOperation["Call", 2022, 10, 1]]出现这种情况是因为第一个操作返回的是 ExternalFunction(因为 date 是一个可以初始化的类),而您向 date 构造函数传递的是一个不完整的 ExternalOperation:
obj["date" ]为了安全地进行连锁操作,而不需要在每一步都检查返回类型,请一次性运行所有操作:
obj["date", ExternalOperation["Call", 2022, 10, 1]]一旦任何操作失败,就会返回一个 Failure 对象,从而阻止其他操作运行:
obj["not_a_valid_attribute", ExternalOperation["Call", 2022, 10, 1]]DeleteObject[session]巧妙范例 (1)
session = StartExternalSession[{"Python", "Evaluator" -> <|"Dependencies" -> "chess"|>, "SessionProlog" -> "import chess, chess.svg"}]创建一个 ExternalObject 来表示棋盘的状态:
board = ExternalEvaluate[session, "chess.Board()"]PlotBoard[b_] := ImportString[ExternalFunction[session, "chess.svg.board"][b], "SVG"]PlotBoard[board]board["fullmove_number"]board["push_san" -> "e4"]PlotBoard[board]moves = board["legal_moves"];ucigetter = ExternalOperation["GetAttribute", "uci"] /* ExternalOperation["Call"]ExternalEvaluate[session, ucigetter[RandomChoice[moves]]]board["push_san" -> ucigetter[RandomChoice[moves]]]PlotBoard[board]RandomChessPlay[board_, n_Integer : 1, processor_ : Identity] := Table[board["push_san" -> ucigetter[RandomChoice[board["legal_moves"]]]];processor[board], n]Column[RandomChessPlay[board, 4, PlotBoard]]board["fullmove_number"]DeleteObject[session]参见
StartExternalSession ExternalEvaluate ExternalSessionObject ExternalFunction ExternalOperation
Function Repository: PythonObject
相关指南
-
▪
- 外部已诠释的语言接口 ▪
- 外部语言接口
文本
Wolfram Research (2018),ExternalObject,Wolfram 语言函数,https://reference.wolfram.com/language/ref/ExternalObject.html (更新于 2024 年).
CMS
Wolfram 语言. 2018. "ExternalObject." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2024. https://reference.wolfram.com/language/ref/ExternalObject.html.
APA
Wolfram 语言. (2018). ExternalObject. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/ExternalObject.html 年
BibTeX
@misc{reference.wolfram_2026_externalobject, author="Wolfram Research", title="{ExternalObject}", year="2024", howpublished="\url{https://reference.wolfram.com/language/ref/ExternalObject.html}", note=[Accessed: 04-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_externalobject, organization={Wolfram Research}, title={ExternalObject}, year={2024}, url={https://reference.wolfram.com/language/ref/ExternalObject.html}, note=[Accessed: 04-September-2026]}