本文将向您进一步介绍并演示借助 Tencent Cloud SDK for Python 如何为无服务器云函数创建多个例程并调用它们,这是绑定到无服务器云函数的进阶。
这是由 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性,如果您未曾阅读如何将一个无服务器云函数绑定到 Python 原生同步或异步函数的实践文档,请先阅读:
在上一篇最佳实践中我们得知借助 Tencent Cloud SDK for Python 可以快速实现将一个或多个 Python 原生的同步或异步函数绑定到指定的无服务器云函数,进而以完全 Python 原生调用的形态组织代码以屏蔽或减少开发者对无服务器云函数调用时的 RPC 流程感知。
遗憾的是,该高级特性仅适用于无服务器云函数调用方,而被调用的无服务器云函数依旧需要以传统事件处理的方式组织一个或多个功能的代码实现。当我们在一个无服务器云函数中提供的相关功能较多时,开发者还需要在无服务器云函数执行方法中实现事件解析和派发。
因此,Tencent Cloud SDK for Python 通过提供另外一种高级特性以解决这些问题,我们将其称之为适用于无服务器云函数集成调用的例程派发框架,简称无服务器云函数例程。
与绑定到无服务器云函数的高级特性相同,无服务器云函数例程特性也使用 Python 高级特性装饰器实现,这意味着开发者可以以更简洁、美观的代码快速集成该特性。什么是 Python 装饰器?
没有理解?没关系,在下文中我们将通过几个简单的应用场景向您进一步说明如何使用无服务器云函数例程特性组成您的应用程序代码逻辑。
在下文中我们将列举几段连续的示例代码并向您介绍 Tencent Cloud SDK for Python 所提供的无服务器云函数例程特性的工作流程。
假定我们需要在一个无服务器云函数中实现对加法和减法的算术运算:
首先我们需要创建一个名为 arithmetic
的无服务器云函数:
然后,我们需要为无服务器云函数 arithmetic 编写代码。与以往不同,我们将使用 Tencent Cloud SDK for Python 提供的无服务器云函数例程特性和框架。首先我们需要导入使用的命名空间和模块:
接着我们需要调用 use_routine_dispatcher
函数为当前无服务器云函数启用例程派发器框架:
在上述代码中,我们得到一个被称之为例程派发器类型的实例并由变量 dispatcher
存储。例程派发器实际上是一个可解析无服务器云函数例程调用协议的路由,每一个例程派发器实例将管理一个或多个已注册的无服务器云函数例程。没有理解?没关系,让我们继续向下阅读。
然后我们需要编写 2 个例程,分别是 addend
和 subtract
,分别对应加法和减法的算术运算:
或许您已经注意到,无服务器云函数例程实际上是一个套用例程派发装饰器的一个 Python 原生函数,在上述代码中我们仅需要为 Python 原生函数使用 @dispatcher.routine
装饰器即可将其注册为可调用的无服务器云函数例程。
到此,无服务器云函数 arithmetic
的代码已完成编写。
在上文中我们已经创建名为 arithmetic
的无服务器云函数,并分别实现适用于加法和减法算术运算的无服务器云函数例程,现在让我们在一个本地函数中调用它们:
首先,我们需要导入所依赖的命名空间和模块:
接着,我们需要在本地函数的 Python 模块全局获取一个无服务器云函数产品客户端实例:
然后,我们需要为无服务器云函数的 addend
和 subtract
分别创建 2 个 Python 原生函数,并将他们分别绑定到对应的无服务器云函数例程:
是的,对无服务器云函数例程的绑定与对无服务器云函数的绑定非常相似。
我们仅需要定义 2 个与无服务器云函数例程签名完全一致的 Python 原生函数,然后为其分别套用 @function_client.bind_routine
装饰器即可。现在对 Python 原生函数 addend
和 subtract
的调用等同于对无服务器云函数 arithmetic
的例程 addend
和 subtract
的调用。
值得注意的是,我们将这些与无服务器云函数例程签名相同的 Python 函数称之为 Python 原生扮演函数。
当然,如果您不希望在应用程序中为每一个无服务器云函数例程编写对应的 Python 原生函数,您可以选择由 Tencent Cloud SDK for Python 代您创建一个与指定无服务器云函数例程相关联的 Python 原生函数:
现在,变量 addend
和 subtract
为可调用的 Python 原生函数对象。
最后,我们尝试在本地函数中调用无服务器云函数 arithmetic
的例程 addend
和 subtract
,并打印输出加法和减法算术运算的结果:
请注意,如果您使用方法 seletc_routine
创建无服务器云函数例程的 Python 原生扮演函数,您需要完全使用关键字参数调用,否则 Tencent Cloud SDK for Python 无法确定每个参数对应的位置:
如果您希望在调用无服务器云函数例程时获得 RPC 流程感知,您可以使用方法 routine_invoke
:
如果一切正常,您将会在终端看到如下输出:
属性
值
数据中心
ap-shanghai
命名空间
default
函数名称
arithmetic
运行环境
Python 3.6
本文将向您介绍并演示借助 Tencent Cloud SDK for Python 如何以 Python 原生函数的形式调用指定无服务器云函数。
当我们谈论到如何使用 Tencent Cloud SDK for Python 调用无服务器云函数时,或许首先想到的是利用无服务器云函数产品客户端所提供的 invoke
、easy_invoke
或 schedule_invoke
等实例方法快速发起对指定无服务器云函数的调用并获得运行结果。
但除此之外,我们还可以借助 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性以 Python 原生函数的形式调用指定无服务器云函数。
通常情况下我们在当前运行环境中对无服务器云函数的调用过程或许都可以被称之为 RPC(远程过程调用),开发者可以感知到 RPC 过程的存在。例如我们使用无服务器云函数产品客户端所提供的 easy_invoke
实例方法调用指定无服务器云函数时,我们可以感知到这是一次调用请求。
通过利用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的 Python 原生调用高级特性,我们可以将对无服务器云函数的调用封装为对一个 Python 原生函数的调用。这样当开发者对相关联的 Python 原生函数调用时等同于对指定无服务器云函数的调用,从而屏蔽 RPC 过程感知。
没有理解?没关系,在下文中我们将通过一个简单的场景介绍并演示如何使用该高级特性。
假定我们在数据中心 ap-shanghai
的命名空间 default
拥有一个已创建就绪的无服务器云函数 addend
,其无服务器云函数的配置为:
其无服务器云函数的源代码为:
在该场景中,我们要求在本地 Python 脚本中实现对无服务器云函数 addend
的调用,传入函数事件字段 value1
和 value2
并获得实际返回值。
其调用必须以 Python 原生函数的形式呈现。
在下文中,我们将通过几个步骤向您演示编写符合当前场景要求的代码示例:
首先,我们需要导入依赖的 Tencent Cloud SDK for Python 的命名空间和模块:
接着,我们需要为 Python 脚本编写入口函数,所有代码逻辑将在该函数中实现。
在上文示例代码中,我们首先实例化一个无服务器云函数产品客户端和访问凭据;接着使用无服务器云函数产品客户端的实例方法 select_function
选择一个无服务器云函数并获得与之对应的 Python 原生函数 addend
;最后调用 Python 原生函数 addend
并打印输出无服务器云函数 addend
的实际返回值。
在获得的 Python 原生函数 addend
内部,其将调用与之关联的无服务器云函数产品客户端的实例方法 easy_invoke
实现对指定无服务器云函数的调用。
请注意,对关联无服务器云函数的 Python 原生函数调用时其参数必须完全使用关键字参数传递,参数名即为指定无服务器云函数运行时事件的字段名称,否则行为是未定义的。
在上文示例代码中所涉及的 API 如下:
最后,我们尝试运行本地 Python 脚本,如果一切正常将输出:
或许您已经注意到,使用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端的实例方法 select_function
所获得的关联 Python 原生函数无法使用顺序参数,且无法与类方法、类实例方法相结合并获得 IDE 所提供的引导提示。
如果您希望以类方法、类实例方法或函数的形式以可控的函数或方法签名组成您的代码,或许使用 Tencent Cloud SDK for Python 的无服务器云函数客户端所提供的另一项高级特性更加合适:
本文将向您进一步介绍并演示借助 Tencent Cloud SDK for Python 如何将无服务器云函数绑定到类方法、类实例方法或函数,这是获得关联无服务器云函数的 Python 原生函数的进阶。
这是由 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的高级特性,如果您未曾阅读如何选择一个无服务器云函数并获得与之关联的 Python 原生函数的实践文档,请先阅读:
在上篇实践文档中我们得知 Tencent Cloud SDK for Python 的无服务器云函数产品客户端的实例方法 select_function
可以选择一个无服务器云函数并获得与之相关联的 Python 原生函数,通过对 Python 原生函数的调用即为对关联无服务器云函数的调用,从而屏蔽 RPC 感知。
遗憾的是,我们无法控制所获得与无服务器云函数关联的 Python 原生函数的签名和形态,且不能将其集成为类方法或类实例方法。与此同时,我们或许还需要在全局范围内维护一个 Python 原生函数实例。
不过无需担心,Tencent Cloud SDK for Python 的无服务器云函数产品客户端提供了另一种高级特性用于解决上述问题,我们将其称之为绑定到无服务器云函数。
与关联到无服务器云函数的高级特性不同,绑定到无服务器云函数特性使用 Python 高级特性装饰器实现,这意味着开发者可以以更简洁、美观的代码快速集成该特性。
没有理解?没关系,在下文中我们将通过几个简单的应用场景向您进一步说明如何使用绑定到无服务器云函数特性组成您的应用程序代码逻辑。
在下文中我们将列举几段连续的示例代码并向您介绍 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的绑定到无服务器云函数特性的工作流程,我们仍然以无服务器云函数 addend
为例:
首先我们需要在应用程序中导入所依赖的 Tencent Cloud SDK for Python 相关命名空间和模块:
然后我们需要在应用程序源代码的适合层级实例化一个或多个无服务器云函数产品客户端和访问凭据,在下文中我们将选择 Python 模块全局变量作为适合层级:
在上文示例代码中,我们所实例化的无服务器云函数产品客户端由 Python 模块全局变量 function_client
存储。
Python 原生函数可能是我们将应用程序与无服务器云函数相集成的多数选择。
我们首先为无服务器云函数 addend
编写在 Python 原生函数的投射:
在上文示例代码中,Python 原生函数 addend
将引发 NotImplementedError
异常,该异常指示当前函数逻辑未实现。
接下来我们需要做的是,为无服务器云函数 addend
的 Python 原生投射函数套用一层装饰器:
上文示例代码中是 Python 原生投射函数 addend
套用 Python 装饰器后的形态。
最后,我们尝试调用在上文示例代码中定义的 Python 原生函数 addend
并获得运行结果:
如果一切正常,我们将得到打印输出:
绑定的无服务器云函数 addend
运行事件为:
有时或许我们希望使用 Python 类方法或类实例方法与无服务器云函数相集成。
首先我们需要编写一个可实例化的类以演示如何将类方法或类实例方法绑定到无服务器云函数:
在上文示例代码中,我们定义了符号名为 Addition
的实例类。该类拥有一个实例方法 get_result
用于计算类属性 value1
和 value2
的相加值。
接着,我们需要将实例类 Addition 的实例方法 get_result
绑定到无服务器云函数 addend
以实现加法运算功能。套用装饰器后的实例类形态如下:
在上文示例代码中我们额外使用了一个在绑定 Python 函数时未使用也不受支持的装饰器参数 include_attributes
。该参数允许提供一个列表实例,列表实例的成员为需要从当前所绑定类方法或类实例方法的类实例或静态类中所额外包含的公开属性名称。
被装饰器参数 include_attributes
包含的类公开属性名和值将作为绑定的无服务器云函数运行时事件的字段名称和值,被绑定的类方法或类实例方法的参数也将包括在其中,这与是否使用并设置装饰器参数 include_attributes
的值无关。
请注意,被绑定的类方法的首个参数名称必须为 cls;被绑定的类实例方法的首个参数名称必须为 self,否则行为是未定义的。
最后,我们尝试实例化一个 Addition
类并调用其实例方法 get_result
获得加法运算结果:
如果一切正常,我们将得到打印输出:
绑定的无服务器云函数 addend
运行事件为:
或许您已经注意到,使用 Tencent Cloud SDK for Python 的无服务器云函数产品客户端所提供的绑定到无服务器云函数高级特性时,调用被绑定的函数、类方法或类实例方法支持顺序参数和关键字参数,与 Python 原生函数、类方法或类实例方法的参数传递规则一致。
这是因为 Tencent Cloud SDK for Python 在实现过程中使用 Python 反射(自省)高级特性实现对被绑定可调用对象的参数名称的检查。
配置
值
运行环境
Python 3.6
内存上限
64 MBytes
入口函数
index.main
运行角色
QCS_SCFExcuteRole