尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python.NET泛型实战:如何在Python中使用Dictionary[String, Int32]等C泛型类型

Python.NET泛型实战:如何在Python中使用Dictionary[String, Int32]等C泛型类型 Python.NET泛型实战如何在Python中使用Dictionary[String, Int32]等C#泛型类型【免费下载链接】pythonnetPython for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers.项目地址: https://gitcode.com/gh_mirrors/py/pythonnetPython.NETpythonnet是官方出品的 Python for .NET 集成库它为 Python 程序员提供与 .NET 通用语言运行时CLR近乎无缝的互操作能力。本文是一份面向新手的泛型实战指南带你快速掌握如何在 Python 中创建和使用Dictionary[String, Int32]这样的 C# 泛型类型包括泛型实例化、泛型方法调用、泛型数组以及常见报错的解决办法。一、准备工作让 Python 看到 .NET 程序集使用泛型类型前先让 Python.NET 加载对应的 .NET 程序集。核心只有两步import clr加载运行时再用clr.AddReference引入程序集。import clr # System 程序集通常已可用如需其他程序集再显式加载 clr.AddReference(System) import System from System import Int32, String 入口文件为仓库根目录的 clr.pyimport clr会自动初始化 CLR 运行时。二、创建 C# 泛型实例下标语法是核心C# 泛型类型必须绑定具体类型参数后才能实例化。Python.NET 用 Python 原生的下标[]语法实现这一过程非常直观。from System.Collections.Generic import Dictionary # 等价于 C# 的 new Dictionarystring, int() dict1 Dictionary[String, Int32]() dict1[score] 100 dict1.Add(level, 5) print(dict1[score]) # 100 print(dict1.Count) # 2几个要点键值类型顺序与 C# 一致Dictionary[K, V]第一个是键第二个是值。Python 内置类型可以直接替代Dictionary[str, int]在多数场景下可用str会被映射为System.String、int映射为System.Int32。但这组映射并非严格一一对应官方文档已提示该特性存在歧义详见 doc/source/python.rst 的 Using Generics 一节生产代码中建议显式写System.String、System.Int32行为最可预期。完整的行为验证可参考测试文件tests/test_generic.py中的test_python_type_aliasing用例。三、常用操作像操作普通对象一样操作泛型集合绑定后得到的就是一个普通 Python 对象C# 方法、属性、索引器全部照常使用from System.Collections.Generic import Dictionary from System import String, Int32 ages Dictionary[String, Int32]() ages[Alice] 30 ages[Bob] 25 # C# 方法与属性 ages.ContainsKey(Alice) # True ages.Remove(Bob) ages.Count # 1 # 遍历 Keys / Values可转为 Python 列表 names list(ages.Keys) 小技巧对方法调用help()或查看__doc__可以看到 CLR 方法的完整签名重载时尤其有用。四、泛型方法调用类型推断 显式绑定C# 的泛型方法同样支持两种使用方式与类型参数绑定完全相同的下标语法。方式一让运行时自动推断类型参数obj.SomeGenericMethod(hello) # 自动推断 T String方式二用下标显式指定类型参数from System import UInt32 obj.SomeGenericMethodUInt32多个类型参数用逗号分隔例如SomeGenericMethodString, Int32。官方文档中该语法位于 Advanced Usage → Overloaded and Generic Methods 小节doc/source/python.rst。五、泛型数组System.Array[T]C# 的T[]语法在 Python 中不能直接使用Python.NET 用System.Array[T]表示泛型数组可直接用 Python 列表初始化from System import Int32 arr System.ArrayInt32 print(arr.Length) # 3 print(arr[0]) # 1tests/test_generic.py中有大量真实用例展示了泛型类型数组如何参与方法重载选择是理解类型绑定的最佳范例。六、常见坑与排错清单 ️直接实例化开放泛型类型会报TypeErrorDictionary()这样不写类型参数直接调用是非法的泛型类型定义本身只能作为工厂。这一点在运行时实现src/runtime/Types/GenericType.cs中有明确报错信息cannot instantiate an open generic type。Nullable[T]有专门处理可空值类型用System.Nullable[System.Int32]构造对可空类型无参构造会抛出TypeError。同名时非泛型类型优先如果一个命名空间里同时存在非泛型和泛型同名类型裸名字始终解析为非泛型版本此时想使用泛型版本必须写成TypeName[参数]。约束不满足时报TypeError带泛型约束constraint的类型传入不满足约束的参数时绑定阶段即失败。例如tests/test_generic.py中GenericTypeWithConstraint[System.Object]会直接抛出TypeError。泛型方法传参类型不匹配时注意重载选择当自动推断失败时用MethodT显式绑定而不是换参数写法。七、延伸学习泛型行为测试tests/test_generic.py覆盖类型别名、开放类型、重载选择、数组转换等全部场景官方用法说明doc/source/python.rst 中的 Using Generics 与 Overloaded and Generic Methods运行时实现src/runtime/Types/GenericType.cs、src/runtime/Types/MethodBinding.cs掌握下标绑定这一核心语法后Dictionary[String, Int32]、List[T]、HashSet[T]等所有 .NET 泛型类型都能在 Python 中顺畅使用。接下来可以尝试用 pythonnet 脚本化你的 .NET 业务逻辑把 C# 泛型 API 直接纳入 Python 工作流。【免费下载链接】pythonnetPython for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers.项目地址: https://gitcode.com/gh_mirrors/py/pythonnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表