如何使用 CPython 让泛型在 Python.NET 中工作
How can I get generics to work in Python.NET with CPython
如何让泛型在 Python.NET 中与 CPython 一起工作。使用 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 并得到了同样的错误。
含铁Python-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]'>
这不起作用,因为 System
命名空间中存在 EventHandler
class 的通用和非通用版本。名称过载。您需要表明您想要通用版本。
我不确定 Python.NET 究竟如何处理重载 classes/functions,但它似乎有一个 Overloads
属性。 尝试这样的事情,看看结果如何:
EventHandler_EventArgs = EventHandler.Overloads[EventArgs]
(这行不通)
似乎 Python.NET 没有办法解析重载的 class 名称,每个重载都被视为单独的不同类型(使用它们的 clr 名称)。它不做与 IronPython 相同的事情,而是将它们归为一个单一的包含类型。
在这种特殊情况下,EventArgs
名称对应于非通用 EventArgs
类型。您需要直接从 System 模块获取适当的类型,如 filmor 所示。
您可以显式获取通用 class 对象:
EventHandler = getattr(System, 'EventHandler`1')
数字表示通用参数的数量。
如何让泛型在 Python.NET 中与 CPython 一起工作。使用 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 并得到了同样的错误。
含铁Python-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]'>
这不起作用,因为 System
命名空间中存在 EventHandler
class 的通用和非通用版本。名称过载。您需要表明您想要通用版本。
我不确定 Python.NET 究竟如何处理重载 classes/functions,但它似乎有一个 Overloads
属性。 尝试这样的事情,看看结果如何:
EventHandler_EventArgs = EventHandler.Overloads[EventArgs]
(这行不通)
似乎 Python.NET 没有办法解析重载的 class 名称,每个重载都被视为单独的不同类型(使用它们的 clr 名称)。它不做与 IronPython 相同的事情,而是将它们归为一个单一的包含类型。
在这种特殊情况下,EventArgs
名称对应于非通用 EventArgs
类型。您需要直接从 System 模块获取适当的类型,如 filmor 所示。
您可以显式获取通用 class 对象:
EventHandler = getattr(System, 'EventHandler`1')
数字表示通用参数的数量。