我在windows7上安装了64位CPython 3.4。我使用pythonnet包(2.0.0.dev1)。 我想实例化动作委托,但它给了我一个错误。
def display(num):
print("num=", num)
import clr
clr.AddReference("System")
import System
paction=System.Action[System.Int32](display)
我收到此错误:
TypeError Traceback(最近一次调用最后一次) in() ----> 1 paction = System.Action [System.Int32](显示) TypeError:unsubscriptable对象
我想这是指定泛型的方式。
我已经检查了文档和this帖子,但仍然没有看到问题。 我还使用Overload方法进行了一些调整,但也没有帮助:
paction=System.Action.Overloads[System.Int32](display)
TypeError Traceback(最近一次调用最后一次) in() ----> 1 paction = System.Action.Overloads [System.Int32](显示) TypeError:找不到构造函数签名的匹配项
答案 0 :(得分:2)
问题是System.Action
(没有参数,因此不是通用的)是阴影System.Action<T>
而System.Func
直接映射到System.Func<T>
。我想这是因为System.Func
总是具有通用参数,并且似乎存在针对泛型的重载实现。
Python.NET中的泛型名称为Action`1
(一般来说:Action`N
,其中N
是泛型参数的数量)。您可以使用模块上的getattr
来获取包装器对象:
Action = getattr(System, "Action`1")
action = Action[Int32](display)
答案 1 :(得分:1)
我也面临这个问题。我创建了一个在Python.Net中使用Actions的工作
使用以下代码创建.net类库项目:
using System;
namespace PythonHelper
{
public class Generics
{
public static Action<T1, T2> GetAction<T1, T2>(Func<T1, T2, object> method)
{
return (a, b) => method(a,b);
}
}
}
将其编译为dll文件并将其包含在Python.net项目中(clr.AddReference('PythonHelper')
)
现在,在您的Python.net项目中,您可以使用以下代码创建泛型:
import clr
clr.AddReference('PythonHelper')
import System
from System import DateTime, Func
from PythonHelper import Generics
def myCallback(a,b):
print a, b
func = Func[DateTime, DateTime, System.Object](myCallback)
action = Generics.GetAction[DateTime, DateTime](func)
如果您需要创建一个包含更多或更少参数的动作,您必须自己添加另一个GetAction方法。