gpt4 book ai didi

python - python 中 COM 对象的正确类型提示是什么?

转载 作者:行者123 更新时间:2023-12-02 09:33:06 26 4
gpt4 key购买 nike

我正在 python 中使用 COM 对象来向第 3 方软件公开可编程接口(interface)。这是通过使用 win32com.client 中的 Dispatch 来实现的。我的项目也一直在使用 python.3.7 中的类型提示,但是我不确定如何为了类型提示的目的定义这些 COM 对象的类型。这个问题涉及我拥有的所有 COM 对象,一个真实的例子是 Microsoft Direct X Recordset:Dispatch("ADODB.Recordset")

from win32com.client import Dispatch
def create_my_com_object_instance(input_arg: Dict[str, Union[str, float, int]]) -> <type_of_com_object_here>:
my_instance = Dispatch("ADODB.Recordset")
# Set attributes/call methods of this instance here ...
return my_instance

在上面的代码片段中,我将用 COM 对象类型替换“type_of_com_object_here”。

我的第一个想法是在实例上调用 type() 并使用返回的类型:

x = Dispatch("ADODB.Recordset")
x
Out[1]: <win32com.gen_py.Microsoft ActiveX Data Objects 6.1 Library._Recordset instance at 0x83848456>
type(x)
Out[2]: win32com.gen_py.B691E011-1797-432E-907A-4D8C69339129x0x6x1._Recordset._Recordset
x.__class__
Out[3]: win32com.gen_py.B691E011-1797-432E-907A-4D8C69339129x0x6x1._Recordset._Recordset

这不会返回用于定义 COM 对象的合适类型。我相信我可以使用 TypeVar('T')Generic[] 创建一个抽象基类,但是我不确定是否有更多 pythonic/更好的替代方案可用.

谢谢

最佳答案

恐怕您不幸遇到了使用 Python 进行输入的限制之一。特别是:

  1. 据我所知,Typeshed 或第 3 方模块中都没有 pywin32 库的类型 stub 。这意味着没有现有的规范引用来说明该类型应该是什么。
  2. 动态分派(dispatch)到任意对象将会突破仅使用类型提示可以表达的内容的限制(假设 Dispatch 确实分派(dispatch)到任意对象)。

因此,我推荐以下三种方法之一:

  1. 如果您不想对返回类型进行任何假设,并将其视为不透明的 blob,请让返回类型仅为 object。这是限制性最强且类型安全的选项,因为符合 PEP 484 的类型检查器将允许调用者仅使用所有 Python 对象中存在的方法,例如 __str__ 或 __eq__ 。 >.

  2. 如果您想对返回类型绝对不做任何假设,但又不想对其使用施加任何限制,请将返回类型设置为 Any ,动态类型。这是最宽松和最不安全的操作:您说输出是某种动态类型,并告诉类型检查器让调用者随心所欲地使用返回的对象。

    可以这么说,这是“默认选项”:由于 pywin32 没有可用的类型 stub ,类型检查器将回退到假设 Dispatch(...) 有一个返回类型任意。

  3. 如果您确定返回类型始终具有某些可用的特定方法或属性,则返回类型为 Protocol 。协议(protocol)基本上允许您进行结构子类型化:任何碰巧实现协议(protocol)方法和属性的类都被视为该协议(protocol)的子类型,即使该类没有以任何方式从协议(protocol)继承。如果您熟悉 Go,协议(protocol)基本上就像 Go 的接口(interface)。

    您可能需要在此处创建专用的 create_adodb_recordset(...) 函数,以便您可以更全面地自定义返回类型。

关于python - python 中 COM 对象的正确类型提示是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com