如何使用CPython在Python.NET中使用泛型

时间:2016-02-18 23:11:33

标签: python .net clr ironpython python.net

如何使用CPython在Python.NET中使用泛型。使用Python.NET Using Generics

中的下标语法时出错
TypeError: unsubscriptable object

使用Python 2.7.11 + pythonnet == 2.1.0.dev1

>python.exe
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import EventHandler
>>> from System import EventArgs
>>> EventHandler[EventArgs]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsubscriptable object

我还尝试过pythonnet == 2.0.0并使用ReleaseWin x86构建表单github ca15fe8并得到了同样的错误。

使用IronPython-2.7.5:

>ipy.exe
IronPython 2.7.5 (2.7.5.0) on .NET 4.0.30319.0 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import EventHandler
>>> from System import EventArgs
>>> EventHandler[EventArgs]
<type 'EventHandler[EventArgs]'>

2 个答案:

答案 0 :(得分:3)

您可以明确地获取泛型类对象:

var dt = new Date();
var time = dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds();
$("#timer").text(time);

该数字表示通用参数的数量。

答案 1 :(得分:1)

这不起作用,因为EventHandler命名空间中存在System类的泛型和非泛型版本。名称已超载。您需要指明您需要通用版本。

我不确定Python.NET如何处理重载的类/函数,但似乎它具有Overloads属性。 尝试这样的事情,看看情况如何:

EventHandler_EventArgs = EventHandler.Overloads[EventArgs]

(这不起作用)

似乎Python.NET没有办法解决重载的类名,每个重载都被视为单独的不同类型(使用它们的clr名称)。它没有做与IronPython相同的事情,并将它们归为一个包含类型。

在这种特殊情况下,EventArgs名称对应于非通用EventArgs类型。您需要直接从系统模块获取相应的类型,如电影所示。